Background Information and Report Outline:

This is a professional data analysis report documenting the Coronavirus, also known as Covid-19, in relation to its spread in South Africa within a timeframe of 6 months. The aim of this report is to showcase insights gathered through the acquisition and processing of tweets from applicable media agencies, facilitated by the social media platform Twitter. The result, will reflect a body of information structured in a manner reflecting that of:

  1. Background Information and Introduction

  2. Data acquisition and Reasoning: a) data read ins b) and data cleaning with pre-processing.

  3. Report Results consisting of a) individual data source justification and plot descriptions b) with further implementation of various text analysis tools.

A total of ten media sources were selected initially. Each undergoing a mixture of analysis using a variety of data/text analysis tools and means of visualisation. The information displayed were gathered and formulated through consulting the latest 3200 tweets of the official media agency Twitter accounts described below. In processing these tweets, six introductory insights were chosen to express the information gathered namely, Frequency of Tweets, Most Liked Tweets, Top Hashtags, Most Frequently Shared Tweets, Top Mentions and Top words. This process, using these predetermined six insights will be repeated but within the context of all ten media sources.

It is imperative to note, that after careful consideration it was decided upon to only use six media sources for further analysis. This decision was made based on the results cultivated through the six insights presented above. These media sources are Bhekisisa, NICD, Health24, HealthZA, News24 and eNCA.The author -based text network described later in this report uses all 10 media accounts, but other than that, all other analysis tools are limited to using only the chosen six media accounts.

How and where data is collected:

In acquiring the needed tweets with meta-data, Twitter API V1 was utilised. The resulting data frames undergo processing towards the desired output.

The data used in this report was acquired from a variety of news media Twitter accounts, as well as Covid-19 vaccination data from the Mediahack group. The Twitter account data was acquired with the use of the Twitter API via the twitterR and rtweet packages in R. The accounts’ tweet data was first obtained using the get_timeline() function, thereafter the data was saved by using the saveRDS() function. The data was saved so that while the analyses were conducted, the changes in Twitter data would not interfere with the report. The saved account tweet data was then read in and stored by using the readRDS() function.

Reading in and saving Twitter account timelines

Cleaning and Pre-processing Data:

Each media source’s tweet data was pre-processed and cleaned. This was done by first creating a corpus of the tweet data, then un-nesting the tokens of the text variable, thereafter we removed stop words, punctuation, and other unnecessary words such as “https, http, rt, t.co and amp”. The cleaned data was then filtered and sorted depending on the type of analysis we conducted.

Report Results:

Minimum Requirements:

BHEKISISA (@Bhekisisa_MG)

Bhekisisa is an independent Centre for Health Journalism. The information conveyed through them is used and published by numerous other accredited news sources and media agents. The COVID-19 virus is a pandemic, which concerns the healthcare sector of South Africa as a whole, the role of Bhekisisa as an informative platform seems imperative within this context.

In the last month, there has not been any significant changes in the frequency of tweets by Bhekisisa. Except for a rapid spike at the end of June, which could have a correlation to the Covid-19 third wave.

1st most liked tweet of Bhekisisa was a tweet concerning a Covid -19 webinar hosted by Bhekisisa, with the host being their Editor-in-chief, Mia Malan. 2nd Most liked tweet is a tweet concerning the induction of a new type of ATM machine, which is not relevant to this report. 3rd being a tweet mentioning the Bhekisisa hosted webinar regarding the Covid pandemic with a section mentioning covid vaccination sites. The 4th most liked tweet conveyed information pertaining national Covid statistics and the 5th described the situation regarding Johnson & Johnson vaccinations for teachers.

Top hashtags of Bhekisisa are structured as follows: 1. ‘#COVID19SA’, 2. ‘#COVID19’, 3. ‘#BhekisisaResource’, 4. ‘#vaccine’, 5. ‘#VaccineRolloutSA’ 6. ‘#COVID19inSA’, 7. ‘#Pfizer’, 8. ‘#JnJ’ 9. ‘#COVID’, 10. ‘#vaccines’.

The most shared tweet by Bhekisisa is a tweet concerning abortion activism, and as such can be deemed insignificant.

The top mention of @Bhekisisa_MG is that of a Bhekisisa reporter named Joan van Dyk (@vandykjoan), second being ‘@miamalan’. The 3rd and 4th referring to Professor Abdool Karim, who can be viewed as the face of Covid related science in South Africa.

Top words graph: ‘vaccine’ was the fourth most prominent word followed by ‘jab’ at 5th place. The first most frequently used word within the Bhekisisa tweets was ‘archive’, as the Bhekisisa Twitter account uses the word to refer to their own resource pool with which their followers can interact with. The second and third words, ‘people’ and ‘south’ are deemed insignificant.

National Institute of Communicable Diseases (@nicd_sa)

The National Institute for Communicable Diseases (NICD) is a South African National public health institute. Its’ actions are determined by the South African government, reflecting means of response, monitoring, training, diagnostics, and research of communicable diseases. One of its main purposes being outbreak response and surveillance.

Time series showing the frequency of NICD tweets over time indicates that on average more than 90 tweets are made per week except for June 27 where less than 90 tweets were made.

NICD’s most liked tweet contains information regarding the initial outbreak of the SARS-CoV-2 virus, also referred to as covid-19. The 2nd most liked tweet from the NICD account is a tweet praising SA’s frontline health workers in the struggle against the Covid-19 outbreak. The third most liked tweet is a tweet signalling the early increase of confirmed cases within South Africa. The fourth most liked tweet indicates the confirmed cases within South Africa reaching 1505. The 5th most liked tweet is another informative tweet on the growing number of confirmed cases in South Africa.

Top hashtags are structured as follows: 1. ‘#COVID19’, 2. ‘#FightCOVID19’, 3. ‘#StaySafe’, 4. ‘#COVID19Surveillance’, 5. ‘#FlattenTheCurve’ 6. ‘#StayAtHome’, 7. ‘#SpreadTheFacts’, 8. ‘#coronavirus’ 9. ‘#TisTheSeasonToBeSafe’, 10. ‘#StayAthome’.

The most frequently shared tweet contains information about the rising confirmed cases of COVID-19, at 402 confirmed cases.

The NICD is a major provider of national health information with ‘@HealthZA’ (SA Department of Health) being the most frequent mention within their tweets. Followed by ‘ @nicdsa’ and ‘@DrZweliMkhize’, the National Minister of Health, at the time. The ‘@WHO’ and ‘@SAHPRA1’, two significant Covid-19 related institutes, one being national and the other international.

The most frequent word within NICD tweets is ‘total’, followed by ‘death’ and ‘update’. This could be an indication of COVID statistics being released by the NICD platform. The fourth and fifth words are ‘safe’ and ‘tests’.

South African Department of Health (@HealthZA)

The South African Department of Health is an organizational sector within the South African government concerned with all aspects of national health. The executive department consists of several committees and councils all with the main goal of increasing the health status of the South African citizen.

The frequency of HealthZA tweets do not showcase any noteworthy information.

1st Most liked Tweet is that of a message from SA’s Department of Health announcing that there are recoveries among reported Covid-19 cases. The 2nd referring to international help in SA’s COVID-19 cause, especially that of Cuban medical staff. The 3rd tweet informing the public on details about the second reported covid-related death in SA. The 4th giving an update on confirmed and recovered cases, followed by the 5th which contains information on the spread of Covid through social interactions.

Top hashtags are structured as follows: 1. ‘#COVID19’, 2. ‘#CoronaVirusSA’, 3. ‘#CoronaVirusUpdate’, 4. ‘#Covid19’, 5. ‘#CoronavirusSA’ 6. ‘#VaccineRolloutSA’, 7. ‘#CoronaVirus’, 8. ‘#StaySafe’ 9. ‘#coronavirus’, 10. ‘#CelebrateSafe’.

The Department of Health’s most shared tweet is an announcement telling citizens who were part of certain cruise trips to contact the department as soon as possible.

@GautengHealth’ is among the top five mentions of HealthZA tweets, this is referring to the current severity of the lockdown within the province. Among those in the top 10 mentions are, ‘@CyrilRamaphosa’, ‘@MRCza’, ‘@UNICEFSA’, @nicdsa’, ‘@WHOSouthAfrica’ and ‘@WestCapeHealth’. All these mentions can be related to the Covid-19 pandemic.

The most frequent word is ‘south’ followed by ‘africa’. The logical reasoning for this would be that most tweets would contain these two terms as the account holder is the National Department of Health. The 3rd term is ‘total’ followed by ‘deaths’, as covid statistics are released through this channel. The 5th most frequent word is ‘covid19’ and the 8th is ‘tests’.

Eye Witness News (@ewnreporter)

Eye Witness News is a South African news agency covering media on a broad base of applicable industries and sectors.

Time series of the frequency of tweets by EWN indicates that on average the account tweets in a volatile manner.

None of the most liked tweets of the EWN Twitter account are related to COVID and as such is deemed irrelevant.

Top hashtags are structured as follows: 1. ‘#COVID19’, 2. ‘#FightCOVID19’, 3. ‘#StaySafe’, 4. ‘#COVID19Surveillance’, 5. ‘#FlattenTheCurve’ 6. ‘#StayAtHome’, 7. ‘#SpreadTheFacts’, 8. ‘#coronavirus’ 9. ‘#StayAthome’, 10. ‘#TisTheSeasonToBeSafe’.

The most frequently shared tweet of News24 is unrelated to covid-19.

The top mentions in EWN tweets are unrelated to Covid-19.

Most frequently words in EWN news tweets are ‘police’, ‘people’, ‘cape’, followed with ‘covid19’ in the 4th position and ‘health’ in 5th.

NEWS24 (@News24)

News24 is on of South Africa’s most prominent online news platforms and was launched in 2007.

There are no significant peaks or low points News24 tweets.

The most liked tweet is unrelated to COVID-19, including the 2nd, 3rd,4th and 5th.

Top hashtags are structured as follows: 1. ‘#COVID19’, 2. ‘#FightCOVID19’, 3. ‘#StaySafe’, 4. ‘#COVID19Surveillance’, 5. ‘#FlattenTheCurve’ 6. ‘#StayAtHome’, 7. ‘#SpreadTheFacts’, 8. ‘#coronavirus’ 9. ‘#StayAthome’, 10. ‘#TisTheSeasonToBeSafe’.

The most frequently shared tweet of News24 is unrelated to covid-19.

Top mention being ‘@HealthZA’, the South African Department of Health, followed by ‘@nicdsa’ and ‘@DrZweliMkhize’, the South African Minister of Health. The World Health Organisation (@WHO) and SAHPRA (@SAHPRA1), which is a branch of the South African Department of Health tasked with the regulation of all health -related products and clinical trials in SA, are within the top 10 of these mentions.

Most frequenly used word within News24 tweets is ‘covid19’, followed by more irrelevant words such as ‘south’, ‘cape’ and ‘court’.

SABC News (@SABCNews)

The SABC News account was chosen because it is the official Twitter-based digital platform used by the South African Broadcasting Corporation, which is one of the most popular and reputable news media sources in South Africa.

The SABC News time-series graph shows that the SABC twitter account tweets on average more than 40 tweets a day for the past month, except for the 14th June and 4th July 2021 where the average was less than 40.

The table showing the most liked tweets indicates that the top five most liked tweets cover the following topics (in descending order): The political unrest in Eswatini, the constitutional court sentencing former President Jacob Zuma to 15 months imprisonment for contempt of court, the National Liquor Traders Council states that some members vow to defy the ban on alcohol sales, the same as the second tweet mentioned and, lastly, that the former Eskom board chair, Jabu Mabuza, has passed a way due to COVID-19. From these top five tweets only two pertain to the COVID-19 pandemic.

The bar chart showing the top ten hashtags of SABC News Tweets for the past 3200 tweets, indicates that the following hashtags are the most prevalent. “#SABCNews”, “#EURO2020”, “#ICYMI”, “#COVID19”, “#Jacob Zuma”, “#SABCWeather”, “#Euro2020”, “#StateCaptureInquiry”, “#coronavirus”, and “#COVID19SA”.

The table showing the most frequently shared tweet from SABC News is about the political unrest in Eswatini and does not directly pertain to the COVID-19 pandemic.

The bar chart showing the top mentions in SABC News Tweets indicates that the most frequent mentions are “@12H00”, “@YouTube”, “@17H00”, “@18H00”, “@PogbaNo1fan”, “@TheWatchdogSABC” and “@vuyomvoko”. The mentions do not provide any insight about the COVID-19 pandemic.

The bar chart showing the top ten words used in SABC News Tweets indicate that the top ten words are “covid19”, “south”, “president”, “Africa”, “court”, “African”, “health”, “people”, “minister” and “video” are their top words. The chart indicates that the top word is “covid19” which appears in more than 200 tweets.

eNCA (@eNCA)

The eNCA account was chosen because it belongs to the eNCA 24-hour news channel that presents news about South Africa and Africa. The account joined in May 2011.

The eNCA time series graph shows that eNCA tweets more than 50 tweets a day over the past month except for the week before the 7th June 2021, where there were few to zero tweets.

The table showing the most frequently shared tweet as of July 2021 is regarding the death of a Nigerian televangelist TB Joshua.

The bar chart showing the top hashtags in eNCA tweets indicates that (in descending order) “#DStv403”, “#eNCA”, “#COVID19”, “#eNCAs”, “#SouthAfricanMorning”, “#NewsLink”, “#SouthAfricaTonight”, “#PropertyMatters”, “#AllAngles”, “#TheMiddayView” and “#TheLead” are their top hashtags. It should be noted that the COVID-19 pandemic ranks third in eNCA’s top hashtags, while the rest of the hashtags refer to either eNCA themself or the respective programmes on their television channel (DSTV403).

The table showing the most liked tweets indicates that the top five most liked tweets of eNCA are (in descending order) a news report of the death of TB Joshua, news report of Zuma supporters defying lockdown regulations, news report of President Cyril Ramaphosa’s address to the nation and night, a news report of former President Zuma being sentenced to 15 months imprisonment and another report of the same thing.

The bar chart showing the top mentions in eNCA tweets indicates that (in descending order) “@SallyBurdettSA”, “@AbsaSouthAfrica, “@FaithMangope”, “@BetterBondSA”, “@GarethEdwardsSA”, “@ABwanakawa”, “@SiphamandlaGoge”, “@TheRealClementM”, “@MasegoRahlaga” and “@revue” are the top mentions in their tweets.

The bar chart showing the top words in eNCA tweets indicate that (in descending order) “covid19”, “south”, “president”, “Africa”, “court”, “African”, “health”, “people”, “minister” and “video” are the top words used in their tweets. From this figure, it is indicated that the term “covid19” is the most prevalent term in the eNCA tweets collected.

South African Government (@GovernmentZA)

The South African Government account was chosen because it is an official account of the government, providing accurate and trustworthy information regarding the COVID-19 pandemic and lockdown regulations.

The SA Government time series graph shows that the account does not post tweets very regularly, averaging less than 25 tweets a week and their past 3200 tweets span five months. There was a spike in in tweets around March 2021.

The table showing the most frequently shared tweet as of July 2021 is regarding President Cyril Ramaphosa’s address to the nation with regards to the COVID-19 pandemic on 1 February 2021.

The bar chart showing the top hashtags in SA Government tweets indicates that (in descending order) “#COVID19”, “#StaySafe”, “#VaccinateToSaveSouthAfrica”, “#SONA2021”, “#COVID19SA”, “#ChooseVaccination”, “#GrowSouthAfrica”, “#VaccineRolloutSA”, “#RIP JacksonMthembu”, “PostCabinet” and “#Covid19SA”. From this figure it can be seen that majority of the top terms refer to the COVID-19 pandemic or the vaccination of South Africans.

The table showing the most liked tweets indicates that the following are the top five most liked tweets (in descending order): first shipment of Oxford AstraZeneca vaccine doses, the first healthcare worker vaccinated in South Africa, an announcement indicating that President Ramaphosa will meet the arriving shipment of Oxford AstraZeneca vaccines, RIP notice of Jackson Methembu and a report that the President will address the nation on 30 May 2021 with regards to the COVID-19 pandemic.

The bar chart showing the top mentions in SA Government tweets indicates that (in descending order) “@CyrilRamaphosa”, “@DrZwelieMkhize”, “@GovvernmentZA”, “@HealthZA”, “@DDMabuza”, “@ParlimentofRSA”, “@SAPoliceService”, “@DBESA”, “@HigherEduGovZA” and “@GCISMedia” are the top mentions in their tweets.

The bar chart showing the top words in SA Government tweets indicate that (in descending order) “president”, “minister”, “south”, “ramaphosa”, “total”, “africa”, “watch”, “sa”, “vaccination” and “live” are the top words used in their tweets. From this figure, it is indicated that the term “vaccination” is an import and prevalent term in the in the SA Government tweets collected.

South African Government News (@SAgovnews)

Official South African Government News Account on the Twitter Platform.

Among the top 5 most liked tweets from the ‘@SAgovnews’ account none seem to hold relevant information on covid 19.

Top hashtags are structured as follows: 1. ‘#COVID19’, 2. ‘#SONA2021’, 3. ‘#VaccineRolloutSA’, 4. ‘#PostCabinet’, 5. ‘#StaySafe’, 6. ‘#RamaphosaQandA’, 7. ‘#PostCabMediaBriefing’, 8. ‘#BuildingANewEconomy’, 9. ‘#CrimeStatistics’ 10. ‘#FreedomDay2021’

The official news agency of the South African Government’s most frequently shared tweet is not relevant to this report.

The top mentions within the captured tweets of ‘@SAgovnews’ are: 1. ‘@CyrilRamaphosa’ 2. ‘@HealthZA’ 3. ‘@DrZweliMkhize’ 4. ‘@PresidencyZA’ 5. ‘@SAPoliceService’.

The most frequently used word is ‘read’, due to the account using it as an indication of extended reading material through using “[Read]” in the beginning of certain tweets.

Health24 (@Health24com)

Health24 is a branch of News24, difference being that they specialise in healthcare related news, whereas News24 takes a more general appraoch.

The 4th most liked tweet of Health24 pertains that of an article describing the lungs of COVID-19 patients, the only Health24 tweet relevant on this plot.

Top hashtags are structured as follows: 1. ‘#BeyondBeauty’, 2. ‘#SkinCare’, 3. ‘#coronavirus’, 4. ‘#Covid19’, 5. ‘#SkinRenewalSA’, 6. ‘#asthma’, 7. ‘#Tena’, 8. ‘#beyondbeauty’, 9. ‘#SkinRenewal’ 10. ‘#Coronavirus’

The most frequently shared tweet concerns the psychological implications on doctors because of the COVID-19 epidemic.

The top mentions within the captured tweets of ‘@SAgovnews’ are: 1. ‘@CyrilRamaphosa’ 2. ‘@HealthZA’ 3. ‘@DrZweliMkhize’ 4. ‘@PresidencyZA’ 5. ‘@SAPoliceService’.

The 4th most frequently used word is ‘health’, followed by ‘covid19’ at 7th place. Those are solely applicable to this report.

All Chosen Media Tweet Data Analysis

The following section is the analysis of the all the Twitter accounts combined.

The overall media time series graph shows that the collected tweet data span from the end of 2017 till July 2021. From the start till 2020, the tweet frequency was relatively low, however form the beginning of 2020 there was a large increase tweets. This increase can possibly be attributed to the start of lockdown in South Africa. From the start of 2021 there are even larger increases continuing as time goes by.

The table showing the most frequently shared tweet as of July 2021 indicates that the most shared tweet is regarding the death of TB Joshua.

The table showing the most liked tweets indicates that the following are the most liked tweets (in descending order): A principal (Dr Ngwako Stephen Sebopetsa) in Limpopo given a global award, the political unrest in Eswatini, the resignation of Phumzile van Damme as DA MP and party member, the passing of Shaleen Surtie Richards and the postponement of Zuma’s arrest pending ConCourt application.

The bar chart showing the top hashtags in overall media tweets indicates that (in descending order) “#COVID19”, “#DSTV403”, “#eNCA”, “#COVID19SA”, “#StaySafe”, “#CoronaVirusSA”, “#VaccineRolloutSA”, “#vaccine”, “#BhekisisaResource” and “SONA2021”. From this figure it should be noted that hashtags pertaining to the COVID-19 pandemic are most prevalent.

The bar chart showing the top mentions in the overall media tweets indicates that (in descending order) “@CyrilRamaphosa”, “@HealthZA”, “@vandykjoan” ,“@DrZwelieMkhize”, “@Fin24”, “@Sports24news”, “@miamalan”, “@WitnessKZN”, “@BlSouthAfrica” and “@NkoRaphael” are the top mentions in the overall media tweets.

The bar chart showing the top words in the overall tweets indicate that (in descending order) “south”, “covid19”, “total”, “president”, “africa”, “total”, “read”, “minister”, “health”, “deaths” and “people” are the top words used in their tweets. From this figure, it is indicated that the term “covid19” is an import and prevalent term in the in the overall media tweets collected.

Word Cloud of the Corpus of All Combined Media Sources

Topic Modeling

Topic modelling is a type of method used in conducting a text analysis of words grouped together. The method aims to determine the how the meaning of the words is derived from the context of the text. This is not the only method used to analyse grouped words, other examples such as cluster analysis and semantic analysis also exist. The benefits of utilising Topic Modelling include being a mixed model (each document is given a probability of being linked to a topic) and this method makes use of more advanced iterative Bayesian techniques. (Bail, 2020)

What topics have been reported on:

The main topics reported on are the Covid-19 pandemic, vaccinations and the lockdown in South Africa.

A collection of bar charts showing the words with the highest tf-idf for each of the chosen sources.

A collection of beta bar charts showing the words with the highest probabilities for each topic.

Bar chart showing the top ten media topics according to the Beta Matrix media topic model at Topic 1 probabilities.

A collection of gamma bar charts showing the distribution of word probabilities for each topic.

Text Networks

Text Networks are a representation of the relationship between words. These networks are able to represent a corpus of documents or words, where each document or word represents a node and the edges which connect nodes represent how similar words or documents are to each other. In this report, text networks were used to determine how frequent words would occur along side each other, where words represent nodes and edges represent the frequency of the words’ occurrence. (Bail, 2020)

Many benefits exist when using text networks. Text networks help recognise and understand patterns within text and how they are connected. Text networks are workable with text of any length whereas topic modelling only works with short text. By identifying social clusters in texts more insight can be derived from text, as opposed to more simple text analysis techniques.

Author-based Text Network Modeling of All Media Sources:

From the author-based text network figures above, it can be surmised that there are two author clusters or communities. One which consists of SABC News, South African Government News and Health24.com. Another which consists of eNCA, Bhekisisa, EWN and News24. At closer inspection, it can be seen that there is stronger similarity between SA Government News and Health24.com than SABC News. There is strong similarity between eNCA and EWN, Bhekisisa and EWN, as well as News24 and EWN. It should be noted that there is not a strong similarity between Bhekisisa and eNCA, as well as a moderate similarity between EWN and News24 when compared to its other connections.

Word-based Text Network Modeling of All Media Sources:

In the word-based text network, there has been six clusters or communities identified. The latent theme within the pink cluster is the reporting by SABC News on COVID-19. The latent theme within the black cluster focuses on Bhekisisa’s reporting. The red cluster focuses on the ANC. The cyan (bright light blue) cluster focuses on COVID-19 vaccinations. The green cluster focuses on COVID-19 cases and hospitalizations. The blue cluster focuses on COVID-19 case, recovery, death and other associated data. There is a connection between the cyan, green and blue clusters indicating strong similarity in words used to convey similar themes.

The Sentiment of this reporting:

Sentiment analysis is the process with which one tries to identify and classify the underlying emotions drawn from a piece of text.The visualisations and descriptions below were documented using the ‘bing’ lexicon, a text-based dictionary, which transcribes and categorises terms in a binary fashion. A plot containing the average sentiment of each of the 6 media sources were chosen to enable a holistic perspective on the data. In viewing these sentiment visualisations, the difference in government media sources to that of private media agencies become apparent. Government sources, like HealthZA (The South African Department of Health) and others, post tweets reflecting that of a more neutral to positive stance, whereas private media agencies post tweets throughout the sentiment spectrum.

Sentiment Analysis

‘virus’, ‘infected’, ‘epidemic’ are among the top five most negative words. ‘break’ and ‘breaks’ are among the other top five words, an indication of the term ‘outbreak’/’outbreaks’ being used frequently. ‘severe’, ‘fever’ and ‘risk’ are among the top ten negative words. ‘protect’, ‘support’ and ‘effective’ are the top four most positive words with ‘free’ being the top ranked positive sentiment word.

The top ten negative words in NICD tweets could be categorised as being in relation to the coronavirus. Among these negative words are ‘symptoms’, ‘risk’, ‘virus’, ‘sick’, ‘infection’, ‘illness’ and ‘infections’. The top 10 most positive words are ‘safe’, ‘protective’, ‘protect’, ‘smart’, ‘regard’, ‘loved’, ‘correct’, ‘recovery’, ‘ready’ and ‘encourage’.

As with the NICD negative sentiment visualisation, ‘regrettably’ seems to be the word carrying the top negative sentiment within in their tweets. Other words are, ‘risk’, ‘virus’, ‘breakdown’, ‘death’, ‘symptoms’, ‘infections’, ‘isolation’, ‘infection’ and ‘infections’. ‘protect’, ‘recovery’, ‘loved’ are the top three most positive words, followed by ‘positive’, ‘safe’, ‘festive’, ‘support’, ‘patient’, ‘free’ and ‘clean’.

‘infections’, ‘death’ and ‘prison’ are among the top three most negative words. ‘support’, ‘top’ and ‘positive’ are among the top three most positive News24 words. Other than that, there are no other Covid-19 related words.

The top negative words from the Health24 twitter handle are ‘risk’, ‘cancer’, ‘symptoms’, ‘loss’, ‘suffer’, ‘lose’, ‘stress’, ‘allergies’, ‘pain’ and ‘infection’. The top positive words from Health24 are ‘fans’, ‘healthy’, ‘win’, ‘benefits’, ‘protect’, ‘boost’, ‘safe’, ‘improve’, ‘top’ and ‘easy’. The great majority of these words are health related.

‘breaking’ is the most negative word within the eNCA tweets. ‘infections’, ‘virus’ and ‘death’ are among the top 10 most negative words. ‘support’ ‘hot’ ‘free’ ‘top’ ‘premier’ ‘ready’ ‘valuable’ ‘led’ ‘dedicated’ and ‘boost’ are the ten most positive words.

A conclusion can be made that government agencies aim to impose emotions of a more tranquil/positive nature, in opposition to private agencies who solely want to invoke an emotion on any sides of the sentiment spectrum, being that outright negative or outright positive.

Comparison Cloud of the Sentiment of Selected Media Sources

The most significant words potrayed by this analysis is ‘safe’, ‘infections’, ‘work’ and ‘recovery’ which can all be related to the Covid -19 epidemic.

How they difffer:

Over Time:

Time series showing all Twitter activity of chosen media indicates that the is a stark increase in Twitter activity in 2021.There seems to be a strong increase in tweets at the beginning of 2020 and 2021.

Time series of tweets from individual media sources indicates that there was a stark increase in Twitter activity in June and July of 2021.The most active of these media Twitter accounts is News24.

Time series of tweets from individual media sources, which indicates that there are very few retweets by these individual sources.

The above visualisation takes tweets containing the term ‘vaccine’ and measures its’ frequency from 1 June to 31 May 2021. To emphasise the difference in sentiment, this timeline was split in two chunks, one being ‘1 June- 8 July 2021’ and the other ‘14 April- 31 May 2021’. One can see a significant increase in negative sentiment onto the second timeline sentiment.

Additional Requirements:

By Media Source:

Time series line graph showing the the frequency of vaccine tweets over time indicates the frequency of tweets pertaining to vaccinations in South Africa is sharply increasing.

Line graph showing the daily vaccinations over time sharply increasing as more people are permitted to be vaccinated.

The line graph showing the total vaccinations shows steep increases whenever new age groups are permitted to be vaccinated.

When taking all three charts into account it can be surmised that there is a correlation when observing the more age groups are permitted to be vaccinated in South Africa,the more tweets pertaining to vaccines are made.

Report Summary:

The visualisations drawn from the text analysis methods used in this report display certain common characteristics from which certain conclusions can be documented. There seems to be a difference in how selected media sources present information regarding COVID-19 and its underlying branches, such as deaths, vaccinations, and tests. Also, the pertaining sentiment and topics of these subjects.

Vaccinations seem to be reflecting an increasingly negative connotation from its initial spike in use within the tweets of all ten media sources. The occurrence of increasing national vaccinations grow parallel with that of ‘vaccine’ being mentioned in tweets. As described, the increase of vaccinations in younger age groups are also reflecting on ‘vaccine’ increasingly occurring in tweets from these sources.

Contrary to our belief, ‘tests’ or ‘testing’ was not as popular as expected, as it was a major subject matter in the initial rise of COVID -19, back in 2020. ‘covid’ is mentioned within every top 10 words or hashtags of all ten used media sources. Indicating that it still is and has been a very popular term used over a number of months. ‘virus’, ‘infection’ and ‘death’ seem to be the most heavily negative words used in the tweets by the chosen media sources, which are COVID-related. Among other top ten negative words are ‘symptoms’ and ‘risk’. Differences in sentiment between private and government sources should be noted.

In summation, with regards to the topic modelling section, we were able to determine the highest TF-IDF (Term Frequency-Inverse Document Frequency) words in the six selected media sources, the highest word probabilities for each topic, the top ten media topics according to the beta matrix at topic level 1, as well as the distribution of word probabilities for each topic. ‘covid’ has a notable presence within all these analysis methods.

In regard to the text networks, we were able to identify two clusters or communities within the author-based projection text network and six clusters or communities within the word-based projection text network. From these text networks we were able to derive insight from which word or media sources have a strong similarity with each other.

Retrospective:

Looking back there are a few points the project group would like to have changed. Firstly, aesthetic enhancements for graph visualizations such as numeric values on top of bar chart bins and better tabular visualizations. Secondly, a greater use of the Vader and sentimentR packages. Thirdly, more external COVID-19 data that could be collated with Twitter data. Finally, combining the Twitter time series plots with lockdown level and infection wave overlays.

LS0tDQp0aXRsZTogIlNNIEhvbm91cnMgIEluZm9ybWF0aW9uIGFuZCBLbm93bGVkZ2UgaW4gT3JnYW5pc2F0aW9ucyBEYXRhIEFuYWx5c2lzIEFzc2lnbm1lbnQgMjogRGF0YSBDb2xsZWN0aW9uIGFuZCBUZXh0IE1pbmluZyINCmF1dGhvcjogIkNocmlzdGlhbiBNdWxsZXIgKDIxODI1NzkzKSAmIEdpbGxpYW0gdmFuIGRlciBNZXJ3ZSAoMjE2NjA0MDkpIg0Kb3V0cHV0OiBwZGZfZG9jdW1lbnQNCi0tLQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCiMgUGFja2FnZXMgbG9hZGVkIGZvciB1c2UgaW4gdGhpcyByZXBvcnQNCmxpYnJhcnkodGlueXRleCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShydHdlZXQpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHRpZHl0ZXh0KQ0KbGlicmFyeSh0bSkNCmxpYnJhcnkodG9waWNtb2RlbHMpDQpsaWJyYXJ5KHN0bSkNCmxpYnJhcnkoZGV2dG9vbHMpDQpsaWJyYXJ5KHRleHRuZXRzKQ0KbGlicmFyeShodHRwdXYpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShnZ3RoZW1lcykNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkoaHRtbHdpZGdldHMpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkodHdpdHRlUikNCmxpYnJhcnkoTkxQKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KHdvcmRjbG91ZCkNCmxpYnJhcnkoaHR0cikNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KGV4cGxvcmF0b3J5KQ0KbGlicmFyeShzZW50aW1lbnRyKQ0KbGlicmFyeShmb3JjYXRzKQ0KbGlicmFyeSh1ZHBpcGUpDQpsaWJyYXJ5KGxkYXR1bmluZykNCmxpYnJhcnkocXVhbnRlZGEpDQpsaWJyYXJ5KHZhZGVyKQ0KYGBgDQoNCiMgQmFja2dyb3VuZCBJbmZvcm1hdGlvbiBhbmQgUmVwb3J0IE91dGxpbmU6DQpUaGlzIGlzIGEgcHJvZmVzc2lvbmFsIGRhdGEgYW5hbHlzaXMgcmVwb3J0IGRvY3VtZW50aW5nIHRoZSBDb3JvbmF2aXJ1cywgYWxzbyBrbm93biBhcyBDb3ZpZC0xOSwgaW4gcmVsYXRpb24gdG8gaXRzIHNwcmVhZCBpbiBTb3V0aCBBZnJpY2Egd2l0aGluIGEgdGltZWZyYW1lIG9mIDYgbW9udGhzLiBUaGUgYWltIG9mIHRoaXMgcmVwb3J0IGlzIHRvIHNob3djYXNlIGluc2lnaHRzIGdhdGhlcmVkIHRocm91Z2ggdGhlIGFjcXVpc2l0aW9uIGFuZCBwcm9jZXNzaW5nIG9mIHR3ZWV0cyBmcm9tIGFwcGxpY2FibGUgbWVkaWEgYWdlbmNpZXMsIGZhY2lsaXRhdGVkIGJ5IHRoZSBzb2NpYWwgbWVkaWEgcGxhdGZvcm0gVHdpdHRlci4gVGhlIHJlc3VsdCwgd2lsbCByZWZsZWN0IGEgYm9keSBvZiBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVkIGluIGEgbWFubmVyIHJlZmxlY3RpbmcgdGhhdCBvZjoNCg0KMSkgQmFja2dyb3VuZCBJbmZvcm1hdGlvbiBhbmQgSW50cm9kdWN0aW9uDQoNCjIpIERhdGEgYWNxdWlzaXRpb24gYW5kIFJlYXNvbmluZzogYSkgZGF0YSByZWFkIGlucw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKSBhbmQgZGF0YSBjbGVhbmluZyB3aXRoIHByZS1wcm9jZXNzaW5nLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjMpIFJlcG9ydCBSZXN1bHRzIGNvbnNpc3Rpbmcgb2YgYSkgaW5kaXZpZHVhbCBkYXRhIHNvdXJjZSBqdXN0aWZpY2F0aW9uIGFuZCBwbG90IGRlc2NyaXB0aW9ucyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYikgd2l0aCBmdXJ0aGVyIGltcGxlbWVudGF0aW9uIG9mIHZhcmlvdXMgdGV4dCBhbmFseXNpcyB0b29scy4NCiAgICAgICAgICAgDQpBIHRvdGFsIG9mIHRlbiBtZWRpYSBzb3VyY2VzIHdlcmUgc2VsZWN0ZWQgaW5pdGlhbGx5LiBFYWNoIHVuZGVyZ29pbmcgYSBtaXh0dXJlIG9mIGFuYWx5c2lzIHVzaW5nIGEgdmFyaWV0eSBvZiBkYXRhL3RleHQgYW5hbHlzaXMgdG9vbHMgYW5kIG1lYW5zIG9mIHZpc3VhbGlzYXRpb24uIFRoZSBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgd2VyZSBnYXRoZXJlZCBhbmQgZm9ybXVsYXRlZCB0aHJvdWdoIGNvbnN1bHRpbmcgdGhlIGxhdGVzdCAzMjAwIHR3ZWV0cyBvZiB0aGUgb2ZmaWNpYWwgbWVkaWEgYWdlbmN5IFR3aXR0ZXIgYWNjb3VudHMgZGVzY3JpYmVkIGJlbG93LiBJbiBwcm9jZXNzaW5nIHRoZXNlIHR3ZWV0cywgc2l4IGludHJvZHVjdG9yeSBpbnNpZ2h0cyB3ZXJlIGNob3NlbiB0byBleHByZXNzIHRoZSBpbmZvcm1hdGlvbiBnYXRoZXJlZCBuYW1lbHksIEZyZXF1ZW5jeSBvZiBUd2VldHMsIE1vc3QgTGlrZWQgVHdlZXRzLCBUb3AgSGFzaHRhZ3MsIE1vc3QgRnJlcXVlbnRseSBTaGFyZWQgVHdlZXRzLCBUb3AgTWVudGlvbnMgYW5kIFRvcCB3b3Jkcy4gVGhpcyBwcm9jZXNzLCB1c2luZyB0aGVzZSBwcmVkZXRlcm1pbmVkIHNpeCBpbnNpZ2h0cyB3aWxsIGJlIHJlcGVhdGVkIGJ1dCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYWxsIHRlbiBtZWRpYSBzb3VyY2VzLg0KDQpJdCBpcyBpbXBlcmF0aXZlIHRvIG5vdGUsIHRoYXQgYWZ0ZXIgY2FyZWZ1bCBjb25zaWRlcmF0aW9uIGl0IHdhcyBkZWNpZGVkIHVwb24gdG8gb25seSB1c2Ugc2l4IG1lZGlhIHNvdXJjZXMgZm9yIGZ1cnRoZXIgYW5hbHlzaXMuIFRoaXMgZGVjaXNpb24gd2FzIG1hZGUgYmFzZWQgb24gdGhlIHJlc3VsdHMgY3VsdGl2YXRlZCB0aHJvdWdoIHRoZSBzaXggaW5zaWdodHMgcHJlc2VudGVkIGFib3ZlLiBUaGVzZSBtZWRpYSBzb3VyY2VzIGFyZSBCaGVraXNpc2EsIE5JQ0QsIEhlYWx0aDI0LCBIZWFsdGhaQSwgTmV3czI0IGFuZCBlTkNBLlRoZSBhdXRob3IgLWJhc2VkIHRleHQgbmV0d29yayBkZXNjcmliZWQgbGF0ZXIgaW4gdGhpcyByZXBvcnQgdXNlcyBhbGwgMTAgbWVkaWEgYWNjb3VudHMsIGJ1dCBvdGhlciB0aGFuIHRoYXQsIGFsbCBvdGhlciBhbmFseXNpcyB0b29scyANCmFyZSBsaW1pdGVkIHRvIHVzaW5nIG9ubHkgdGhlIGNob3NlbiBzaXggbWVkaWEgYWNjb3VudHMuDQoNCg0KDQojIyBTb3V0aCBBZnJpY2FuIFR3aXR0ZXIncyBUcmVuZGluZyBIYXNodGFncw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCiMgQ29tbWVudGVkIG91dCBjb2RlIHNlY3Rpb25zICBhcmUgdGhlcmUgYmVjYXVzZSB0aGV5ICB3ZXJlIHV0aWxpemVkIGFuZCB0aGVuIGNvbW1lbnRlZCBvdXQsIHNvIGFzIHRvIHByZXNlcnZlIGRhdGEgaW50ZWdyaXR5IGFuZCB0aGUgdGltZWxpbmVzcyBvZiB0aGUgYW5hbHlzZXMuDQoNCiNnZXQgdHdlZXRzDQoNCiMgc2FfdHJlbmRzIDwtIA0KIyAgIGdldF90cmVuZHMoInNvdXRoIGFmcmljYSIpDQojIA0KIyBzYXZlUkRTKHNhX3RyZW5kcywgZmlsZSA9ICJzYV90cmVuZHMucmRzIikNCg0Kc2FfdHJlbmRzIDwtIHJlYWRSRFMoImJhY2t1cF90d2VldHMvc2FfdHJlbmRzLnJkcyIpDQoNCiNzZWxlY3QNCnRvcF9zYV90cmVuZHMgPC0gDQogIHNhX3RyZW5kcyU+JSANCmFycmFuZ2UoLXR3ZWV0X3ZvbHVtZSkgJT4lDQp0b3BfbigxMCwgdHdlZXRfdm9sdW1lKSAlPiUgDQpzZWxlY3QodHJlbmQsIHR3ZWV0X3ZvbHVtZSkNCg0KI1Bsb3QNCmdncGxvdCh0b3Bfc2FfdHJlbmRzLCBhZXMoeCA9IHJlb3JkZXIodHJlbmQsIHR3ZWV0X3ZvbHVtZSksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB0d2VldF92b2x1bWUgKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSArDQogIHhsYWIoIkhhc2h0YWdzIikgKw0KICB5bGFiKCJWb2x1bWUgb2YgVHdlZXRzIikgKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIGdndGl0bGUoIlNvdXRoIEFmcmljYSdzIFRyZW5kaW5nIEhhc2h0YWdzIikrDQogIGxhYnMoY2FwdGlvbiA9ICJVcGRhdGVkOiBKdWx5IDIwMjEiKQ0KYGBgDQoNCkF0IHByZXNlbnQsIHRoZXJlIGlzIG5vIHRyZW5kaW5nIGhhc2h0YWcgdGhhdCBkaXJlY3RseSBwZXJ0YWlucyB0byB0aGUgQ09WSUQtMTkgcGFuZGVtaWMsIHJhdGhlciBpbnN0ZWFkIG1vc3QgaGFzaHRhZ3MgcGVydGFpbiB0byB0aGUgcG9saXRpY2FsIGFuZCBzb2NpYWwgaGFwcGVuaW5nIGluIEdhdXRlbmcgYW5kIEt3YVp1bHUtTmF0YWwgZHVlIHRvIEphY29iIFp1bWEncyBhcnJlc3QuIEhhc2h0YWdzIHRoYXQgY2FuIGluZGlyZWN0bHkgYmUgYXR0cmlidXRlZCB0byB0aGUgcGFuZGVtaWMgaW5jbHVkZSAiaHVuZ2VyIiBhbmQgInBvdmVydHkiIGR1ZSB0byB0aGUgZWNvbm9taWMgaW1wYWN0IG9mIHRoZSBwYW5kZW1pYyBhbmQgbG9ja2Rvd24gcmVndWxhdGlvbnMuDQoNCiMgSG93IGFuZCB3aGVyZSBkYXRhIGlzIGNvbGxlY3RlZDoNCkluIGFjcXVpcmluZyB0aGUgbmVlZGVkIHR3ZWV0cyB3aXRoIG1ldGEtZGF0YSwgVHdpdHRlciBBUEkgVjEgd2FzIHV0aWxpc2VkLiBUaGUgcmVzdWx0aW5nIGRhdGEgZnJhbWVzIHVuZGVyZ28gcHJvY2Vzc2luZyB0b3dhcmRzIHRoZSBkZXNpcmVkIG91dHB1dC4NCg0KVGhlIGRhdGEgdXNlZCBpbiB0aGlzIHJlcG9ydCB3YXMgYWNxdWlyZWQgZnJvbSBhIHZhcmlldHkgb2YgbmV3cyBtZWRpYSBUd2l0dGVyIGFjY291bnRzLCBhcyB3ZWxsIGFzIENvdmlkLTE5IHZhY2NpbmF0aW9uIGRhdGEgZnJvbSB0aGUgTWVkaWFoYWNrIGdyb3VwLiBUaGUgVHdpdHRlciBhY2NvdW50IGRhdGEgd2FzIGFjcXVpcmVkIHdpdGggdGhlIHVzZSBvZiB0aGUgVHdpdHRlciBBUEkgdmlhIHRoZSBgYGB0d2l0dGVyUmBgYCBhbmQgYGBgcnR3ZWV0YGBgIHBhY2thZ2VzIGluIFIuIFRoZSBhY2NvdW50c+KAmSB0d2VldCBkYXRhIHdhcyBmaXJzdCBvYnRhaW5lZCB1c2luZyB0aGUgYGBgZ2V0X3RpbWVsaW5lKClgYGAgZnVuY3Rpb24sIHRoZXJlYWZ0ZXIgdGhlIGRhdGEgd2FzIHNhdmVkIGJ5IHVzaW5nIHRoZSBgYGBzYXZlUkRTKClgYGAgZnVuY3Rpb24uIFRoZSBkYXRhIHdhcyBzYXZlZCBzbyB0aGF0IHdoaWxlIHRoZSBhbmFseXNlcyB3ZXJlIGNvbmR1Y3RlZCwgdGhlIGNoYW5nZXMgaW4gVHdpdHRlciBkYXRhIHdvdWxkIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUgcmVwb3J0LiBUaGUgc2F2ZWQgYWNjb3VudCB0d2VldCBkYXRhIHdhcyB0aGVuIHJlYWQgaW4gYW5kIHN0b3JlZCBieSB1c2luZyB0aGUgYGBgcmVhZFJEUygpYGBgIGZ1bmN0aW9uLiANCg0KIyMgUmVhZGluZyBpbiBhbmQgc2F2aW5nIFR3aXR0ZXIgYWNjb3VudCB0aW1lbGluZXMNCg0KYGBge3IgR0VUIFRJTUVMSU5FLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgZWNobz1GQUxTRX0NCiMgPC0gDQojZ2V0X3RpbWVsaW5lKCJAQmhla2lzaXNhX01HIiwgbiA9IDMyMDAsIGluY2x1ZGVfcnRzID0gRiwNCiMgICAgICAgICAgICAgICAgcmV0cnlvbnJhdGVsaW1pdCA9IFRSVUUpDQoNCmJoZWtpc2lzYV90d2VldHMgPC0gcmVhZFJEUygiYmFja3VwX3R3ZWV0cy9iaGVraXNpc2FfdHdlZXRzLnJkcyIpDQoNCiMgc2F2ZVJEUyhiaGVraXNpc2FfdHdlZXRzLCBmaWxlID0gImJoZWtpc2lzYV90d2VldHMucmRzIikNCiMgDQojbmljZF90d2VldHMgPC0gDQojICBnZXRfdGltZWxpbmUoIkBuaWNkX3NhIiwgbiA9IDMyMDAsIGluY2x1ZGVfcnRzID0gRikNCiMgDQojc2F2ZVJEUyhuaWNkX3R3ZWV0cywgZmlsZSA9ICJuaWNkX3R3ZWV0cy5yZHMiKQ0KDQpuaWNkX3R3ZWV0cyA8LSByZWFkUkRTKCJiYWNrdXBfdHdlZXRzL25pY2RfdHdlZXRzLnJkcyIpDQoNCiNoZWFsdGh6YV90d2VldHMgPC0gDQojICAgZ2V0X3RpbWVsaW5lKCJASGVhbHRoWkEiLCBuID0gMzIwMCwgaW5jbHVkZV9ydHMgPSBGKQ0KIyANCiMgc2F2ZVJEUyhoZWFsdGh6YV90d2VldHMsIGZpbGUgPSAiaGVhbHRoemFfdHdlZXRzLnJkcyIpDQoNCmhlYWx0aHphX3R3ZWV0cyA8LSByZWFkUkRTKCJiYWNrdXBfdHdlZXRzL2hlYWx0aHphX3R3ZWV0cy5yZHMiKQ0KIA0KI2V3bnJlcG9ydGVyX3R3ZWV0cyA8LQ0KIyAgZ2V0X3RpbWVsaW5lKCJAZXducmVwb3J0ZXIiLCBuID0gMzIwMCwgaW5jbHVkZV9ydHMgPSBGKQ0KIyANCiMgc2F2ZVJEUyhld25yZXBvcnRlcl90d2VldHMsIGZpbGUgPSAiZXducmVwb3J0ZXJfdHdlZXRzLnJkcyIpDQoNCmV3bnJlcG9ydGVyX3R3ZWV0cyA8LSByZWFkUkRTKCJiYWNrdXBfdHdlZXRzL2V3bnJlcG9ydGVyX3R3ZWV0cy5yZHMiKQ0KDQojI25ld3MyNF90d2VldHMgPC0gDQojICAgZ2V0X3RpbWVsaW5lKCJATmV3czI0IiwgbiA9IDMyMDAsIGluY2x1ZGVfcnRzID0gRikNCiMgDQojIHNhdmVSRFMobmV3czI0X3R3ZWV0cywgZmlsZSA9ICJuZXdzMjRfdHdlZXRzLnJkcyIpDQoNCm5ld3MyNF90d2VldHMgPC0gcmVhZFJEUygiYmFja3VwX3R3ZWV0cy9uZXdzMjRfdHdlZXRzLnJkcyIpDQoNCiNTQWdvdm5ld3NfdGltZWxpbmVfZGYgPC0NCiMgIGdldF90aW1lbGluZSgiQFNBZ292bmV3cyIsIG4gPSAzMjAwLCBpbmNsdWRlX3J0cyA9IEYpDQojIA0KIyBzYXZlUkRTKFNBZ292bmV3c190aW1lbGluZV9kZiwgZmlsZSA9ICJTQWdvdm5ld3NfdGltZWxpbmVfZGYucmRzIikNCg0KU0Fnb3ZuZXdzX3RpbWVsaW5lX2RmIDwtIHJlYWRSRFMoImJhY2t1cF90d2VldHMvU0Fnb3ZuZXdzX3RpbWVsaW5lX2RmLnJkcyIpDQoNCiAjaGVhbHRoMjRfdGltZWxpbmVfZGYgPC0gDQogIyAgZ2V0X3RpbWVsaW5lKCJASGVhbHRoMjRjb20iLCBuID0gMzIwMCwgaW5jbHVkZV9ydHMgPSBGKQ0KIyANCiMgc2F2ZVJEUyhoZWFsdGgyNF90aW1lbGluZV9kZiwgZmlsZSA9ICJoZWFsdGgyNF90aW1lbGluZV9kZi5yZHMiKQ0KDQpoZWFsdGgyNF90aW1lbGluZV9kZiA8LSByZWFkUkRTKCJiYWNrdXBfdHdlZXRzL2hlYWx0aDI0X3RpbWVsaW5lX2RmLnJkcyIpDQoNCiAjR292ZXJubWVudFpBX3RpbWVsaW5lX2RmIDwtDQogIyAgZ2V0X3RpbWVsaW5lKCJAR292ZXJubWVudFpBIiwgbiA9IDMyMDAsIGluY2x1ZGVfcnRzID0gRikNCiMgDQojIHNhdmVSRFMoR292ZXJubWVudFpBX3RpbWVsaW5lX2RmLCBmaWxlID0gIkdvdmVybm1lbnRaQV90aW1lbGluZV9kZi5yZHMiKQ0KDQpHb3Zlcm5tZW50WkFfdGltZWxpbmVfZGYgPC0gcmVhZFJEUygiYmFja3VwX3R3ZWV0cy9Hb3Zlcm5tZW50WkFfdGltZWxpbmVfZGYucmRzIikNCg0KI3NhYmNfbmV3c190aW1lbGluZV9kZiA8LSANCiMgICBnZXRfdGltZWxpbmUoIkBTQUJDTmV3cyIsIG4gPSAzMjAwLCBpbmNsdWRlX3J0cyA9IEYpDQojIA0KIyBzYXZlUkRTKHNhYmNfbmV3c190aW1lbGluZV9kZiwgZmlsZSA9ICJzYWJjX25ld3NfdGltZWxpbmVfZGYucmRzIikNCg0Kc2FiY19uZXdzX3RpbWVsaW5lX2RmIDwtIHJlYWRSRFMoImJhY2t1cF90d2VldHMvc2FiY19uZXdzX3RpbWVsaW5lX2RmLnJkcyIpDQoNCiNlbmNhX3RpbWVsaW5lX2RmIDwtIA0KIyAgZ2V0X3RpbWVsaW5lKCJAZU5DQSIsIG4gPSAzMjAwLCBpbmNsdWRlX3J0cyA9IEYpDQojIA0KIyBzYXZlUkRTKGVuY2FfdGltZWxpbmVfZGYsIGZpbGUgPSAiZW5jYV90aW1lbGluZV9kZi5yZHMiKQ0KDQplbmNhX3RpbWVsaW5lX2RmIDwtIHJlYWRSRFMoImJhY2t1cF90d2VldHMvZW5jYV90aW1lbGluZV9kZi5yZHMiKQ0KDQp2YWNjaW5hdGlvbnMgPC0gDQogIHJlYWQuY3N2KCJodHRwOi8vYXBpLm1lZGlhaGFjay5jby56YS9hZGgvc2EtdmFjY2luYXRpb25zLmNzdiIpDQoNCiMgam9pbnRfdGltZWxpbmVzIDwtDQojICAgZ2V0X3RpbWVsaW5lKGMoIkBCaGVraXNpc2FfTUciLCAiQG5pY2Rfc2EiLCAiQGVOQ0EiLCAiQEhlYWx0aFpBIiwgIkBOZXdzMjQiLCAiQEhlYWx0aDI0Y29tIiksIG4gPSAzMjAwKQ0KIyANCiMgc2F2ZVJEUyhqb2ludF90aW1lbGluZXMsIGZpbGUgPSAiam9pbnRfdGltZWxpbmVzLnJkcyIpDQoNCmpvaW50X3RpbWVsaW5lcyA8LSByZWFkUkRTKCJiYWNrdXBfdHdlZXRzL2pvaW50X3RpbWVsaW5lcy5yZHMiKQ0KDQpgYGANCg0KIyMgQ2xlYW5pbmcgYW5kIFByZS1wcm9jZXNzaW5nIERhdGE6DQoNCkVhY2ggbWVkaWEgc291cmNlJ3MgdHdlZXQgZGF0YSB3YXMgcHJlLXByb2Nlc3NlZCBhbmQgY2xlYW5lZC4gVGhpcyB3YXMgZG9uZSBieSBmaXJzdCBjcmVhdGluZyBhIGNvcnB1cyBvZiB0aGUgdHdlZXQgZGF0YSwgdGhlbiB1bi1uZXN0aW5nIHRoZSB0b2tlbnMgb2YgdGhlIHRleHQgdmFyaWFibGUsIHRoZXJlYWZ0ZXIgd2UgcmVtb3ZlZCBzdG9wIHdvcmRzLCBwdW5jdHVhdGlvbiwgYW5kIG90aGVyIHVubmVjZXNzYXJ5IHdvcmRzIHN1Y2ggYXMgImh0dHBzLCBodHRwLCBydCwgdC5jbyBhbmQgYW1wIi4gVGhlIGNsZWFuZWQgZGF0YSB3YXMgdGhlbiBmaWx0ZXJlZCBhbmQgc29ydGVkIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBhbmFseXNpcyB3ZSBjb25kdWN0ZWQuDQoNCmBgYHtyIGpvaW50X3RpbWVsaW5lc19jbGVhbmluZywgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojIEFkZGl0aW9uYWwgY2xlYW5pbmcNCg0KZ3N1YigiaHR0cFxcUyt8aHR0cHxydHx0LmNvfGFtcCIsICIiLCBqb2ludF90aW1lbGluZXMkdGV4dCkNCg0KIyBSZW1vdmluZyB1bm5lY2Vzc2FyeSBjaGFyYWN0ZXJzDQoNCmpvaW50X3RpbWVsaW5lcyR0ZXh0ID0gc3RyX3JlbW92ZV9hbGwoam9pbnRfdGltZWxpbmVzJHRleHQsICJcXHM/KGZ8aHQpKHRwKShzPykoOi8vKShbXlxcLl0pW1xcLnwvXShcXFMpIikNCmBgYA0KDQoNCmBgYHtyIEJIRUtJU0lTQSBDTEVBTklORywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI0JoZWtpc2lzYSBjbGVhbmluZw0KDQojIENyZWF0aW9uIG9mIGNvcnB1cw0KDQpiaGVraXNpc2FfY29ycHVzIDwtIA0KICBDb3JwdXMoVmVjdG9yU291cmNlKGFzLnZlY3RvcihiaGVraXNpc2FfdHdlZXRzJHRleHQpKSkNCg0KIyB1bi1uZXN0aW5nIHRva2Vucw0KDQp0aWR5X2JoZWtpc2lzYV90d2VldHMgPC0gDQogIGJoZWtpc2lzYV90d2VldHMgJT4lDQogICAgc2VsZWN0KGNyZWF0ZWRfYXQsdGV4dCkgJT4lDQogICAgdW5uZXN0X3Rva2Vucygid29yZCIsIHRleHQpDQoNCiMgUmVvcmRlcmluZyB0d2VldCB3b3Jkcw0KDQp0aWR5X2JoZWtpc2lzYV90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KIyBSZW1vdmluZyBzdG9wIHdvcmRzDQoNCmJoZWtpc2lzYV9jb3JwdXMgPC0gDQogIHRtX21hcChiaGVraXNpc2FfY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbmdsaXNoIikpDQoNCiMgUmVvcmRlcmluZyB0d2VldCB3b3Jkcw0KDQp0aWR5X2JoZWtpc2lzYV90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KIyBSZW1vdmluZyBwdW5jdHVhdGlvbg0KDQpiaGVraXNpc2FfY29ycHVzIDwtIA0KICB0bV9tYXAoYmhla2lzaXNhX2NvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZW1vdmVQdW5jdHVhdGlvbikpDQoNCiMgUmVvcmRlcmluZyB0d2VldCB3b3Jkcw0KDQp0aWR5X2JoZWtpc2lzYV90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KZGF0YSgic3RvcF93b3JkcyIpDQoNCiNNT1NUIEZSRVFVRU5UTFkgU0hBUkVEIExJTksNCmJoZWtpc2lzYV9zaGFyZWRfbGlua3MgPC0gDQogIGJoZWtpc2lzYV90d2VldHMgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVybHNfZXhwYW5kZWRfdXJsKSkgJT4lIA0KICBjb3VudCh1cmxzX2V4cGFuZGVkX3VybCwgc29ydCA9IFRSVUUpICU+JSANCiAgdG9wX24oNSkNCg0KI01vc3QgZnJlcXVlbnQgd29yZHMNCnRvcF9iaGVraXNpc2Ffd29yZHM8LQ0KICAgdGlkeV9iaGVraXNpc2FfdHdlZXRzICU+JQ0KICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICBmaWx0ZXIoISh3b3JkPT0iaHR0cHMifA0KICAgICAgICAgICAgICAgICB3b3JkPT0icnQifA0KICAgICAgICAgICAgICAgICB3b3JkPT0idC5jbyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJhbXAiKSkgJT4lDQogICAgICAgICAgICBjb3VudCh3b3JkKSAlPiUNCiAgICAgICAgICAgICAgYXJyYW5nZShkZXNjKG4pKQ0KDQojTU9TVCBMSUtFRCBUV0VFVA0KYmhla2lzaXNhX2xpa2VkX3R3ZWV0cyA8LQ0KICBiaGVraXNpc2FfdHdlZXRzJT4lIA0KICBhcnJhbmdlKC1mYXZvcml0ZV9jb3VudCkgJT4lDQogIHRvcF9uKDUsIGZhdm9yaXRlX2NvdW50KSAlPiUgDQogIHNlbGVjdChjcmVhdGVkX2F0LCBzY3JlZW5fbmFtZSwgdGV4dCwgZmF2b3JpdGVfY291bnQpDQoNCiNtb3N0IExpa2VkIFR3ZWV0cyBjbGVhbmluZw0KYmhla19tb3N0X2xpa2VkX3R3ZWV0cyA8LQ0KICBiaGVraXNpc2FfbGlrZWRfdHdlZXRzICU+JQ0KICBzZWxlY3QoInRleHQiKQ0KDQpCaGVrX2xpa2VfdmFsIDwtIA0KICByYmluZChjKCcxc3QgTW9zdCBMaWtlZCBUd2VldCcsIA0KICAgICAgICAgICcybmQgTW9zdCBMaWtlZCBUd2VldCcsDQogICAgICAgICAgJzNyZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzR0aCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzV0aCBNb3N0IExpa2VkIFR3ZWV0JyksIA0KICAgICAgICBjKGJoZWtfbW9zdF9saWtlZF90d2VldHMkdGV4dFsxXSwNCiAgICAgICAgICBiaGVrX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMl0sDQogICAgICAgICAgYmhla19tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzNdLA0KICAgICAgICAgIGJoZWtfbW9zdF9saWtlZF90d2VldHMkdGV4dFs0XSwNCiAgICAgICAgICBiaGVrX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNV0pKQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBUV0VFVA0KYmhla2lzaXNhX3NoYXJlZF90d2VldHMgPC0gDQogIGJoZWtpc2lzYV90d2VldHMgJT4lIA0KICBhcnJhbmdlKC1yZXR3ZWV0X2NvdW50KSAlPiUNCiAgc2xpY2UoMSkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIHJldHdlZXRfY291bnQpDQoNCiMgc2hhcmVkIHR3ZWV0IGNsZWFuaW5nDQpiaGVrX21vc3Rfc2hhcmVkX3R3ZWV0IDwtIA0KICBiaGVraXNpc2Ffc2hhcmVkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KYmhla19zaGFyZV92YWwgPC0gDQogIHJiaW5kKGMoJ01vc3QgU2hhcmVkIFR3ZWV0IG9mIEJoZWtpc2lzYScpLA0KICAgICAgICBjKGJoZWtfbW9zdF9zaGFyZWRfdHdlZXQkdGV4dCkpDQoNCg0KI1RPUCBIQVNIVEFHDQpiaGVraXNpc2FfZGZfaGFzaHRhZ3MgPC0gDQogIGJoZWtpc2lzYV90d2VldHMgJT4lIA0KICB1bm5lc3RfdG9rZW5zKGhhc2h0YWcsIHRleHQsICJ0d2VldHMiLCB0b19sb3dlciA9IEZBTFNFKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaGFzaHRhZywgIl4jIikpICU+JQ0KICBjb3VudChoYXNodGFnLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQojVE9QIE1FTlRJT05TDQpiaGVraXNpc2FfbWVudGlvbnMgPC0gDQogIGJoZWtpc2lzYV90d2VldHMgJT4lIA0KICB1bm5lc3RfdG9rZW5zKG1lbnRpb25zLCB0ZXh0LCAidHdlZXRzIiwgdG9fbG93ZXIgPSBGQUxTRSkgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KG1lbnRpb25zLCAiXkAiKSkgJT4lIA0KICBjb3VudChtZW50aW9ucywgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCg0KI1RPUCBXT1JEUw0KYmhla2lzaXNhX3dvcmRzIDwtIA0KICBiaGVraXNpc2FfdHdlZXRzICU+JQ0KICBtdXRhdGUodGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICImYW1wO3wmbHQ7fCZndDsiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJcXHM/KGZ8aHQpKHRwKShzPykoOi8vKShbXlxcLl0pW1xcLnwvXShcXFMpIiksDQogIHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiW15ceDAxLVx4N0ZdIikpICU+JSANCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0LCB0b2tlbiA9ICJ0d2VldHMiKSAlPiUNCiAgZmlsdGVyKCF3b3JkICVpbiUgc3RvcF93b3JkcyR3b3JkLA0KICAhd29yZCAlaW4lIHN0cl9yZW1vdmVfYWxsKHN0b3Bfd29yZHMkd29yZCwgIiciKSwNCiAgc3RyX2RldGVjdCh3b3JkLCAiW2Etel0iKSwNCiAgIXN0cl9kZXRlY3Qod29yZCwgIl4jIiksIA0KICAhc3RyX2RldGVjdCh3b3JkLCAiQFxcUysiKSkgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCmBgYA0KDQpgYGB7ciBOSUNEIENMRUFOSU5HLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQoNCiMgU2FtZSBjbGVhbmluZyBwcm9jZXNzIGFzIGRlc2NyaWJlZCBiZWZvcmUuDQoNCm5pY2RfY29ycHVzIDwtIA0KICBDb3JwdXMoVmVjdG9yU291cmNlKGFzLnZlY3RvcihuaWNkX3R3ZWV0cyR0ZXh0KSkpDQoNCnRpZHlfbmljZF90d2VldHMgPC0gDQogIG5pY2RfdHdlZXRzICU+JQ0KICAgIHNlbGVjdChjcmVhdGVkX2F0LHRleHQpICU+JQ0KICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KQ0KDQp0aWR5X25pY2RfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCm5pY2RfY29ycHVzIDwtIA0KICB0bV9tYXAobmljZF9jb3JwdXMsIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoImVuZ2xpc2giKSkNCg0KdGlkeV9uaWNkX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpuaWNkX2NvcnB1cyA8LSANCiAgdG1fbWFwKG5pY2RfY29ycHVzLCBjb250ZW50X3RyYW5zZm9ybWVyKHJlbW92ZVB1bmN0dWF0aW9uKSkNCg0KdGlkeV9uaWNkX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpkYXRhKCJzdG9wX3dvcmRzIikNCg0KdG9wX25pY2Rfd29yZHM8LQ0KICAgdGlkeV9uaWNkX3R3ZWV0cyAlPiUNCiAgICAgIGFudGlfam9pbihzdG9wX3dvcmRzKSAlPiUNCiAgICAgICAgZmlsdGVyKCEod29yZD09Imh0dHBzInwNCiAgICAgICAgICAgICAgICAgd29yZD09InJ0InwNCiAgICAgICAgICAgICAgICAgd29yZD09InQuY28ifA0KICAgICAgICAgICAgICAgICB3b3JkPT0iYW1wIikpICU+JQ0KICAgICAgICAgICAgY291bnQod29yZCkgJT4lDQogICAgICAgICAgICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KI01PU1QgRlJFUVVFTlRMWSBTSEFSRUQgTElOSw0KbmljZF9zaGFyZWRfbGlua3MgPC0gDQogIG5pY2RfdHdlZXRzICU+JSANCiAgZmlsdGVyKCFpcy5uYSh1cmxzX2V4cGFuZGVkX3VybCkpICU+JSANCiAgY291bnQodXJsc19leHBhbmRlZF91cmwsIHNvcnQgPSBUUlVFKSAlPiUgDQogIHRvcF9uKDUpDQoNCiNNT1NUIEZSRVFVRU5UTFkgU0hBUkVEIFRXRUVUDQpuaWNkX3NoYXJlZF90d2VldHMgPC0NCiAgbmljZF90d2VldHMgJT4lIA0KICBhcnJhbmdlKC1yZXR3ZWV0X2NvdW50KSAlPiUNCiAgc2xpY2UoMSkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIHJldHdlZXRfY291bnQpDQoNCiNNT1NUIExJS0VEIFRXRUVUDQpuaWNkX2xpa2VkX3R3ZWV0cyA8LQ0KICBuaWNkX3R3ZWV0cyU+JSANCiAgYXJyYW5nZSgtZmF2b3JpdGVfY291bnQpICU+JQ0KICB0b3Bfbig1LCBmYXZvcml0ZV9jb3VudCkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIGZhdm9yaXRlX2NvdW50KQ0KDQojbW9zdCBMaWtlZCBUd2VldHMgDQpuaWNkX21vc3RfbGlrZWRfdHdlZXRzIDwtIA0KICBuaWNkX2xpa2VkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KbmljZF9saWtlX3ZhbCA8LSByYmluZChjKCcxc3QgTW9zdCBMaWtlZCBUd2VldCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgJzJuZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgICAgICAgICAgICAgICAgJzNyZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgICAgICAgICAgICAgICAgJzR0aCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgICAgICAgICAgICAgICAgJzV0aCBNb3N0IExpa2VkIFR3ZWV0JyksDQogICAgICAgICAgICAgICAgICAgICAgIGMobmljZF9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG5pY2RfbW9zdF9saWtlZF90d2VldHMkdGV4dFsyXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBuaWNkX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbM10sDQogICAgICAgICAgICAgICAgICAgICAgICAgbmljZF9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzRdLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG5pY2RfbW9zdF9saWtlZF90d2VldHMkdGV4dFs1XSkpDQoNCg0KI1RPUCBIQVNIVEFHDQpuaWNkX2RmX2hhc2h0YWdzIDwtIA0KICBuaWNkX3R3ZWV0cyAlPiUgDQogIHVubmVzdF90b2tlbnMoaGFzaHRhZywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChoYXNodGFnLCAiXiMiKSkgJT4lDQogIGNvdW50KGhhc2h0YWcsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNOSUNEIHNoYXJlZCB0d2VldCANCm5pY2RfbW9zdF9zaGFyZWRfdHdlZXQgPC0gDQogIG5pY2Rfc2hhcmVkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KbmljZF9zaGFyZV92YWwgPC0NCiAgcmJpbmQoYygnTW9zdCBTaGFyZWQgVHdlZXQgb2YgTklDRCcpLA0KICAgICAgICBjKG5pY2RfbW9zdF9zaGFyZWRfdHdlZXQkdGV4dCkpDQoNCiNUT1AgTUVOVElPTlMNCm5pY2RfbWVudGlvbnMgPC0gDQogIG5pY2RfdHdlZXRzICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNUT1AgV09SRFMNCm5pY2Rfd29yZHMgPC0gDQogIG5pY2RfdHdlZXRzICU+JQ0KICBtdXRhdGUodGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICImYW1wO3wmbHQ7fCZndDsiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJcXHM/KGZ8aHQpKHRwKShzPykoOi8vKShbXlxcLl0pW1xcLnwvXShcXFMpIiksDQogIHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiW15ceDAxLVx4N0ZdIikpICU+JSANCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0LCB0b2tlbiA9ICJ0d2VldHMiKSAlPiUNCiAgZmlsdGVyKCF3b3JkICVpbiUgc3RvcF93b3JkcyR3b3JkLA0KICAhd29yZCAlaW4lIHN0cl9yZW1vdmVfYWxsKHN0b3Bfd29yZHMkd29yZCwgIiciKSwNCiAgc3RyX2RldGVjdCh3b3JkLCAiW2Etel0iKSwNCiAgIXN0cl9kZXRlY3Qod29yZCwgIl4jIiksIA0KICAhc3RyX2RldGVjdCh3b3JkLCAiQFxcUysiKSkgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCmBgYA0KDQpgYGB7ciBIZWFsdGhaQSBDbGVhbmluZywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KDQojIFNhbWUgY2xlYW5pbmcgcHJvY2VzcyBhcyBkZXNjcmliZWQgaW4gdGhlIGZpcnN0IGNsZWFuaW5nIGNodW5rDQoNCmhlYWx0aHphX2NvcnB1cyA8LSANCiAgQ29ycHVzKFZlY3RvclNvdXJjZShhcy52ZWN0b3IoaGVhbHRoemFfdHdlZXRzJHRleHQpKSkNCg0KdGlkeV9oZWFsdGh6YV90d2VldHMgPC0gDQogIGhlYWx0aHphX3R3ZWV0cyAlPiUNCiAgICBzZWxlY3QoY3JlYXRlZF9hdCx0ZXh0KSAlPiUNCiAgICB1bm5lc3RfdG9rZW5zKCJ3b3JkIiwgdGV4dCkNCg0KdGlkeV9oZWFsdGh6YV90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KaGVhbHRoemFfY29ycHVzIDwtIA0KICB0bV9tYXAoaGVhbHRoemFfY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbmdsaXNoIikpDQoNCnRpZHlfaGVhbHRoemFfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmhlYWx0aHphX2NvcnB1cyA8LSANCiAgdG1fbWFwKGhlYWx0aHphX2NvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZW1vdmVQdW5jdHVhdGlvbikpDQoNCnRpZHlfaGVhbHRoemFfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmRhdGEoInN0b3Bfd29yZHMiKQ0KDQp0b3BfaGVhbHRoemFfd29yZHM8LQ0KICAgdGlkeV9oZWFsdGh6YV90d2VldHMgJT4lDQogICAgICBhbnRpX2pvaW4oc3RvcF93b3JkcykgJT4lDQogICAgICAgIGZpbHRlcighKHdvcmQ9PSJodHRwcyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJydCJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJ0LmNvInwNCiAgICAgICAgICAgICAgICAgd29yZD09ImFtcCIpKSAlPiUNCiAgICAgICAgICAgIGNvdW50KHdvcmQpICU+JQ0KICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MobikpDQoNCiNNT1NUIEZSRVFVRU5UTFkgU0hBUkVEIExJTksNCmhlYWx0aHphX3NoYXJlZF9saW5rcyA8LQ0KICBoZWFsdGh6YV90d2VldHMgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVybHNfZXhwYW5kZWRfdXJsKSkgJT4lIA0KICBjb3VudCh1cmxzX2V4cGFuZGVkX3VybCwgc29ydCA9IFRSVUUpICU+JSANCiAgdG9wX24oNSkNCg0KI01PU1QgRlJFUVVFTlRMWSBTSEFSRUQgVFdFRVQNCmhlYWx0aHphX3NoYXJlZF90d2VldHMgPC0NCiAgaGVhbHRoemFfdHdlZXRzICU+JSANCiAgYXJyYW5nZSgtcmV0d2VldF9jb3VudCkgJT4lDQogIHNsaWNlKDEpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCByZXR3ZWV0X2NvdW50KQ0KDQojTU9TVCBMSUtFRCBUV0VFVA0KaGVhbHRoemFfbGlrZWRfdHdlZXRzIDwtDQogIGhlYWx0aHphX3R3ZWV0cyU+JSANCiAgYXJyYW5nZSgtZmF2b3JpdGVfY291bnQpICU+JQ0KICB0b3Bfbig1LCBmYXZvcml0ZV9jb3VudCkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIGZhdm9yaXRlX2NvdW50KQ0KDQpoZWFsdGh6YV9tb3N0X2xpa2VkX3R3ZWV0cyA8LQ0KICBoZWFsdGh6YV9saWtlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNCmhlYWx0aHphX2xpa2VfdmFsIDwtIA0KICByYmluZChjKCcxc3QgTW9zdCBMaWtlZCBUd2VldCcsDQogICAgICAgICAgJzJuZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzNyZCBNb3N0IExpa2VkIFR3ZWV0JywNCiAgICAgICAgICAnNHRoIE1vc3QgTGlrZWQgVHdlZXQnLCANCiAgICAgICAgICAnNXRoIE1vc3QgTGlrZWQgVHdlZXQnKSwNCiAgICAgICAgYyhoZWFsdGh6YV9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzFdLA0KICAgICAgICAgIGhlYWx0aHphX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMl0sDQogICAgICAgICAgaGVhbHRoemFfbW9zdF9saWtlZF90d2VldHMkdGV4dFszXSwNCiAgICAgICAgICBoZWFsdGh6YV9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzRdLA0KICAgICAgICAgIGhlYWx0aHphX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNV0pKQ0KDQojVE9QIEhBU0hUQUcNCmhlYWx0aHphX2RmX2hhc2h0YWdzIDwtIA0KICBoZWFsdGh6YV90d2VldHMgJT4lIA0KICB1bm5lc3RfdG9rZW5zKGhhc2h0YWcsIHRleHQsICJ0d2VldHMiLCB0b19sb3dlciA9IEZBTFNFKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaGFzaHRhZywgIl4jIikpICU+JQ0KICBjb3VudChoYXNodGFnLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQojTU9TVCBTSEFSRUQgVFdFRVQgDQpoZWFsdGh6YV9tb3N0X3NoYXJlZF90d2VldCA8LSANCiAgaGVhbHRoemFfc2hhcmVkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KaGVhbHRoemFfc2hhcmVfdmFsIDwtIA0KICByYmluZChjKCdNb3N0IFNoYXJlZCBUd2VldCBvZiBUaGUgRGVwYXJ0bWVudCBvZiBIZWFsdGgnKSwNCiAgICAgICAgYyhoZWFsdGh6YV9tb3N0X3NoYXJlZF90d2VldCR0ZXh0KSkNCg0KI1RPUCBNRU5USU9OUw0KaGVhbHRoemFfbWVudGlvbnMgPC0NCiAgaGVhbHRoemFfdHdlZXRzICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNUT1AgV09SRFMNCmhlYWx0aHphX3dvcmRzIDwtIA0KICBoZWFsdGh6YV90d2VldHMgJT4lDQogIG11dGF0ZSh0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIiZhbXA7fCZsdDt8Jmd0OyIpLA0KICB0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIlxccz8oZnxodCkodHApKDovLykoW15cXC5dKShzPylbXFwufC9dKFxcUykiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJbXlx4MDEtXHg3Rl0iKSkgJT4lIA0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQsIHRva2VuID0gInR3ZWV0cyIpICU+JQ0KICBmaWx0ZXIoIXdvcmQgJWluJSBzdG9wX3dvcmRzJHdvcmQsDQogICF3b3JkICVpbiUgc3RyX3JlbW92ZV9hbGwoc3RvcF93b3JkcyR3b3JkLCAiJyIpLA0KICBzdHJfZGV0ZWN0KHdvcmQsICJbYS16XSIpLA0KICAhc3RyX2RldGVjdCh3b3JkLCAiXiMiKSwgDQogICFzdHJfZGV0ZWN0KHdvcmQsICJAXFxTKyIpKSAlPiUNCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCmBgYA0KDQpgYGB7ciBFV04gQ0xFQU5JTkcsIHJlc3VsdHM9J2hpZGUnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgZWNobz1GQUxTRX0NCg0KIyBTYW1lIGNsZWFuaW5nIHByb2Nlc3MgYXMgZGVzY3JpYmVkIGluIHRoZSBmaXJzdCBjbGVhbmluZyBjaHVuaw0KDQpld25yZXBvcnRlcl9jb3JwdXMgPC0gDQogIENvcnB1cyhWZWN0b3JTb3VyY2UoYXMudmVjdG9yKGV3bnJlcG9ydGVyX3R3ZWV0cyR0ZXh0KSkpDQoNCnRpZHlfZXducmVwb3J0ZXJfdHdlZXRzIDwtIA0KICBld25yZXBvcnRlcl90d2VldHMgJT4lDQogICAgc2VsZWN0KGNyZWF0ZWRfYXQsdGV4dCkgJT4lDQogICAgdW5uZXN0X3Rva2Vucygid29yZCIsIHRleHQpDQoNCnRpZHlfZXducmVwb3J0ZXJfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmV3bnJlcG9ydGVyX2NvcnB1cyA8LSANCiAgdG1fbWFwKGV3bnJlcG9ydGVyX2NvcnB1cywgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiZW5nbGlzaCIpKQ0KDQp0aWR5X2V3bnJlcG9ydGVyX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpld25yZXBvcnRlcl9jb3JwdXMgPC0gDQogIHRtX21hcChld25yZXBvcnRlcl9jb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIocmVtb3ZlUHVuY3R1YXRpb24pKQ0KDQp0aWR5X2V3bnJlcG9ydGVyX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpkYXRhKCJzdG9wX3dvcmRzIikNCg0KI1RvcCB3b3Jkcw0KdG9wX2V3bnJlcG9ydGVyX3dvcmRzPC0NCiAgIHRpZHlfZXducmVwb3J0ZXJfdHdlZXRzICU+JQ0KICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICBmaWx0ZXIoISh3b3JkPT0iaHR0cHMifA0KICAgICAgICAgICAgICAgICB3b3JkPT0icnQifA0KICAgICAgICAgICAgICAgICB3b3JkPT0idC5jbyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJhbXAiKSkgJT4lDQogICAgICAgICAgICBjb3VudCh3b3JkKSAlPiUNCiAgICAgICAgICAgICAgYXJyYW5nZShkZXNjKG4pKQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBMSU5LDQpld25yZXBvcnRlcl9zaGFyZWRfbGlua3MgPC0gDQogIGV3bnJlcG9ydGVyX3R3ZWV0cyAlPiUgDQogIGZpbHRlcighaXMubmEodXJsc19leHBhbmRlZF91cmwpKSAlPiUgDQogIGNvdW50KHVybHNfZXhwYW5kZWRfdXJsLCBzb3J0ID0gVFJVRSkgJT4lIA0KICB0b3Bfbig1KQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBUV0VFVA0KZXducmVwb3J0ZXJfc2hhcmVkX3R3ZWV0cyA8LSANCiAgZXducmVwb3J0ZXJfdHdlZXRzICU+JSANCiAgYXJyYW5nZSgtcmV0d2VldF9jb3VudCkgJT4lDQogIHNsaWNlKDEpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCByZXR3ZWV0X2NvdW50KQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBUV0VFVA0KZXducmVwb3J0ZXJfbW9zdF9zaGFyZWRfdHdlZXQgPC0NCiAgZXducmVwb3J0ZXJfc2hhcmVkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KZXduX3NoYXJlX3ZhbCA8LSANCiAgcmJpbmQoYygnTW9zdCBTaGFyZWQgVHdlZXQgb2YgRVdOIE5ld3MnKSwNCiAgICAgICAgYyhld25yZXBvcnRlcl9tb3N0X3NoYXJlZF90d2VldCR0ZXh0KSkNCg0KI01PU1QgTElLRUQgVFdFRVQNCmV3bnJlcG9ydGVyX2xpa2VkX3R3ZWV0cyA8LQ0KICBld25yZXBvcnRlcl90d2VldHMlPiUgDQogIGFycmFuZ2UoLWZhdm9yaXRlX2NvdW50KSAlPiUNCiAgdG9wX24oNSwgZmF2b3JpdGVfY291bnQpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCBmYXZvcml0ZV9jb3VudCkNCg0KZXducmVwb3J0ZXJfbW9zdF9saWtlZF90d2VldHMgPC0gDQogIGV3bnJlcG9ydGVyX2xpa2VkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KZXduX2xpa2VfdmFsIDwtDQogIHJiaW5kKGMoJzFzdCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzJuZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzNyZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzR0aCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzV0aCBNb3N0IExpa2VkIFR3ZWV0JyksDQogICAgICAgIGMoZXducmVwb3J0ZXJfbW9zdF9saWtlZF90d2VldHMkdGV4dFsxXSwNCiAgICAgICAgICBld25yZXBvcnRlcl9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzJdLA0KICAgICAgICAgIGV3bnJlcG9ydGVyX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbM10sDQogICAgICAgICAgZXducmVwb3J0ZXJfbW9zdF9saWtlZF90d2VldHMkdGV4dFs0XSwNCiAgICAgICAgICBld25yZXBvcnRlcl9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzVdKSkNCg0KI1RPUCBIQVNIVEFHDQpld25yZXBvcnRlcl9kZl9oYXNodGFncyA8LSANCiAgZXducmVwb3J0ZXJfdHdlZXRzICU+JSANCiAgdW5uZXN0X3Rva2VucyhoYXNodGFnLCB0ZXh0LCAidHdlZXRzIiwgdG9fbG93ZXIgPSBGQUxTRSkgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGhhc2h0YWcsICJeIyIpKSAlPiUNCiAgY291bnQoaGFzaHRhZywgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCg0KI1RPUCBNRU5USU9OUw0KZXducmVwb3J0ZXJfbWVudGlvbnMgPC0gDQogIGV3bnJlcG9ydGVyX3R3ZWV0cyAlPiUgDQogIHVubmVzdF90b2tlbnMobWVudGlvbnMsIHRleHQsICJ0d2VldHMiLCB0b19sb3dlciA9IEZBTFNFKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QobWVudGlvbnMsICJeQCIpKSAlPiUgDQogIGNvdW50KG1lbnRpb25zLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQojVE9QIFdPUkRTDQpld25yZXBvcnRlcl93b3JkcyA8LSANCiAgZXducmVwb3J0ZXJfdHdlZXRzICU+JQ0KICBtdXRhdGUodGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICImYW1wO3wmbHQ7fCZndDsiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJcXHM/KHM/KShmfGh0KSh0cCkoOi8vKShbXlxcLl0pW1xcLnwvXShcXFMpIiksDQogIHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiW15ceDAxLVx4N0ZdIikpICU+JSANCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0LCB0b2tlbiA9ICJ0d2VldHMiKSAlPiUNCiAgZmlsdGVyKCF3b3JkICVpbiUgc3RvcF93b3JkcyR3b3JkLA0KICAhd29yZCAlaW4lIHN0cl9yZW1vdmVfYWxsKHN0b3Bfd29yZHMkd29yZCwgIiciKSwNCiAgc3RyX2RldGVjdCh3b3JkLCAiW2Etel0iKSwNCiAgIXN0cl9kZXRlY3Qod29yZCwgIl4jIiksIA0KICAhc3RyX2RldGVjdCh3b3JkLCAiQFxcUysiKSkgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCmBgYA0KDQpgYGB7ciBORVdTMjQgQ0xFQU5JTkcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCg0KIyBTYW1lIGNsZWFuaW5nIHByb2Nlc3MgYXMgZGVzY3JpYmVkIGluIHRoZSBmaXJzdCBjbGVhbmluZyBjaHVuaw0KDQpuZXdzMjRfY29ycHVzIDwtIA0KICBDb3JwdXMoVmVjdG9yU291cmNlKGFzLnZlY3RvcihuZXdzMjRfdHdlZXRzJHRleHQpKSkNCg0KdGlkeV9uZXdzMjRfdHdlZXRzIDwtIA0KICBuZXdzMjRfdHdlZXRzICU+JQ0KICAgIHNlbGVjdChjcmVhdGVkX2F0LHRleHQpICU+JQ0KICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KQ0KDQp0aWR5X25ld3MyNF90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KbmV3czI0X2NvcnB1cyA8LSANCiAgdG1fbWFwKG5ld3MyNF9jb3JwdXMsIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoImVuZ2xpc2giKSkNCg0KdGlkeV9uZXdzMjRfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCm5ld3MyNF9jb3JwdXMgPC0gDQogIHRtX21hcChuZXdzMjRfY29ycHVzLCBjb250ZW50X3RyYW5zZm9ybWVyKHJlbW92ZVB1bmN0dWF0aW9uKSkNCg0KdGlkeV9uZXdzMjRfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmRhdGEoInN0b3Bfd29yZHMiKQ0KDQp0b3BfbmV3czI0X3dvcmRzPC0NCiAgIHRpZHlfbmV3czI0X3R3ZWV0cyAlPiUNCiAgICAgIGFudGlfam9pbihzdG9wX3dvcmRzKSAlPiUNCiAgICAgICAgZmlsdGVyKCEod29yZD09Imh0dHBzInwNCiAgICAgICAgICAgICAgICAgd29yZD09InJ0InwNCiAgICAgICAgICAgICAgICAgd29yZD09InQuY28ifA0KICAgICAgICAgICAgICAgICB3b3JkPT0iYW1wIikpICU+JQ0KICAgICAgICAgICAgY291bnQod29yZCkgJT4lDQogICAgICAgICAgICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KI01PU1QgRlJFUVVFTlRMWSBTSEFSRUQgTElOSw0KbmV3czI0X3NoYXJlZF9saW5rcyA8LQ0KICBuZXdzMjRfdHdlZXRzICU+JSANCiAgZmlsdGVyKCFpcy5uYSh1cmxzX2V4cGFuZGVkX3VybCkpICU+JSANCiAgY291bnQodXJsc19leHBhbmRlZF91cmwsIHNvcnQgPSBUUlVFKSAlPiUgDQogIHRvcF9uKDUpDQoNCiNNT1NUIEZSRVFVRU5UTFkgU0hBUkVEIFRXRUVUDQpuZXdzMjRfc2hhcmVkX3R3ZWV0cyA8LQ0KICBuZXdzMjRfdHdlZXRzICU+JSANCiAgYXJyYW5nZSgtcmV0d2VldF9jb3VudCkgJT4lDQogIHNsaWNlKDEpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCByZXR3ZWV0X2NvdW50KQ0KDQpuZXdzMjRfbW9zdF9zaGFyZWRfdHdlZXQgPC0gDQogIG5ld3MyNF9zaGFyZWRfdHdlZXRzICU+JQ0KICBzZWxlY3QoInRleHQiKQ0KDQpuZXdzMjRfc2hhcmVfdmFsIDwtIA0KICByYmluZChjKCdNb3N0IFNoYXJlZCBUd2VldCBvZiBOZXdzMjQgTmV3cycpLA0KICAgICAgICBjKG5ld3MyNF9tb3N0X3NoYXJlZF90d2VldCR0ZXh0KSkNCg0KI1RPUCBIQVNIVEFHDQpuZXdzMjRfZGZfaGFzaHRhZ3MgPC0gDQogIG5ld3MyNF90d2VldHMgJT4lIA0KICB1bm5lc3RfdG9rZW5zKGhhc2h0YWcsIHRleHQsICJ0d2VldHMiLCB0b19sb3dlciA9IEZBTFNFKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaGFzaHRhZywgIl4jIikpICU+JQ0KICBjb3VudChoYXNodGFnLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQoNCiNUT1AgTUVOVElPTlMNCm5ld3MyNF9tZW50aW9ucyA8LQ0KICBuZXdzMjRfdHdlZXRzICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNNT1NUIExJS0VEIFRXRUVUDQpuZXdzMjRfbGlrZWRfdHdlZXRzIDwtDQogIG5ld3MyNF90d2VldHMlPiUgDQogIGFycmFuZ2UoLWZhdm9yaXRlX2NvdW50KSAlPiUNCiAgdG9wX24oNSwgZmF2b3JpdGVfY291bnQpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCBmYXZvcml0ZV9jb3VudCkNCg0KbmV3czI0X21vc3RfbGlrZWRfdHdlZXRzIDwtDQogIG5ld3MyNF9saWtlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNCm5ld3MyNF9saWtlX3ZhbCA8LSANCiAgcmJpbmQoYygnMXN0IE1vc3QgTGlrZWQgVHdlZXQnLCANCiAgICAgICAgICAnMm5kIE1vc3QgTGlrZWQgVHdlZXQnLA0KICAgICAgICAgICczcmQgTW9zdCBMaWtlZCBUd2VldCcsIA0KICAgICAgICAgICc0dGggTW9zdCBMaWtlZCBUd2VldCcsIA0KICAgICAgICAgICc1dGggTW9zdCBMaWtlZCBUd2VldCcpLA0KICAgICAgICBjKG5ld3MyNF9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzFdLA0KICAgICAgICAgbmV3czI0X21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMl0sDQogICAgICAgICBuZXdzMjRfbW9zdF9saWtlZF90d2VldHMkdGV4dFszXSwNCiAgICAgICAgIG5ld3MyNF9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzRdLA0KICAgICAgICAgbmV3czI0X21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNV0pKQ0KDQojVG9wIHdvcmRzDQpuZXdzMjRfd29yZHMgPC0gDQogIG5ld3MyNF90d2VldHMgJT4lDQogIG11dGF0ZSh0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIiZhbXA7fCZsdDt8Jmd0OyIpLA0KICB0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIlxccz8oZnxodCkodHApKHM/KSg6Ly8pKFteXFwuXSlbXFwufC9dKFxcUykiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJbXlx4MDEtXHg3Rl0iKSkgJT4lIA0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQsIHRva2VuID0gInR3ZWV0cyIpICU+JQ0KICBmaWx0ZXIoIXdvcmQgJWluJSBzdG9wX3dvcmRzJHdvcmQsDQogICF3b3JkICVpbiUgc3RyX3JlbW92ZV9hbGwoc3RvcF93b3JkcyR3b3JkLCAiJyIpLA0KICBzdHJfZGV0ZWN0KHdvcmQsICJbYS16XSIpLA0KICAhc3RyX2RldGVjdCh3b3JkLCAiXiMiKSwgDQogICFzdHJfZGV0ZWN0KHdvcmQsICJAXFxTKyIpKSAlPiUNCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCg0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCg0KIyBTYW1lIGNsZWFuaW5nIHByb2Nlc3MgYXMgZGVzY3JpYmVkIGluIHRoZSBmaXJzdCBjbGVhbmluZyBjaHVuaw0KDQpHb3Zlcm5tZW50WkFfY29ycHVzIDwtIA0KICBDb3JwdXMoVmVjdG9yU291cmNlKGFzLnZlY3RvcihHb3Zlcm5tZW50WkFfdGltZWxpbmVfZGYkdGV4dCkpKQ0KDQp0aWR5X0dvdmVybm1lbnRaQV90d2VldHMgPC0gDQogIEdvdmVybm1lbnRaQV90aW1lbGluZV9kZiAlPiUNCiAgICBzZWxlY3QoY3JlYXRlZF9hdCx0ZXh0KSAlPiUNCiAgICB1bm5lc3RfdG9rZW5zKCJ3b3JkIiwgdGV4dCkNCg0KdGlkeV9Hb3Zlcm5tZW50WkFfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCkdvdmVybm1lbnRaQV9jb3JwdXMgPC0gDQogIHRtX21hcChHb3Zlcm5tZW50WkFfY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbmdsaXNoIikpDQoNCnRpZHlfR292ZXJubWVudFpBX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpHb3Zlcm5tZW50WkFfY29ycHVzIDwtIA0KICB0bV9tYXAoR292ZXJubWVudFpBX2NvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZW1vdmVQdW5jdHVhdGlvbikpDQoNCnRpZHlfR292ZXJubWVudFpBX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpkYXRhKCJzdG9wX3dvcmRzIikNCg0KdG9wX0dvdmVybm1lbnRaQV93b3JkczwtDQogICB0aWR5X0dvdmVybm1lbnRaQV90d2VldHMgJT4lDQogICAgICBhbnRpX2pvaW4oc3RvcF93b3JkcykgJT4lDQogICAgICAgIGZpbHRlcighKHdvcmQ9PSJodHRwcyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJydCJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJ0LmNvInwNCiAgICAgICAgICAgICAgICAgd29yZD09ImFtcCIpKSAlPiUNCiAgICAgICAgICAgIGNvdW50KHdvcmQpICU+JQ0KICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MobikpDQoNCg0KI01PU1QgRlJFUVVFTlRMWSBTSEFSRUQgTElOSw0KR292ZXJubWVudFpBX3NoYXJlZF9saW5rcyA8LQ0KICBHb3Zlcm5tZW50WkFfdGltZWxpbmVfZGYgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVybHNfZXhwYW5kZWRfdXJsKSkgJT4lIA0KICBjb3VudCh1cmxzX2V4cGFuZGVkX3VybCwgc29ydCA9IFRSVUUpICU+JSANCiAgdG9wX24oNSkNCg0KI01PU1QgRlJFUVVFTlRMWSBTSEFSRUQgVFdFRVQNCkdvdmVybm1lbnRaQV9zaGFyZWRfdHdlZXRzIDwtDQogIEdvdmVybm1lbnRaQV90aW1lbGluZV9kZiAlPiUgDQogIGFycmFuZ2UoLXJldHdlZXRfY291bnQpICU+JQ0KICBzbGljZSgxKSAlPiUgDQogIHNlbGVjdChjcmVhdGVkX2F0LCBzY3JlZW5fbmFtZSwgdGV4dCwgcmV0d2VldF9jb3VudCkNCg0KR292ZXJubWVudFpBX21vc3Rfc2hhcmVkX3R3ZWV0IDwtIA0KICBHb3Zlcm5tZW50WkFfc2hhcmVkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KR292WkFfc2hhcmVfdmFsIDwtDQogIHJiaW5kKGMoJ01vc3QgU2hhcmVkIFR3ZWV0IG9mIFNBIEdvdmVybm1lbnQgTmV3cycpLA0KICAgICAgICBjKEdvdmVybm1lbnRaQV9tb3N0X3NoYXJlZF90d2VldCR0ZXh0KSkNCg0KI01PU1QgTElLRUQgVFdFRVQNCkdvdmVybm1lbnRaQV9saWtlZF90d2VldHMgPC0NCiAgR292ZXJubWVudFpBX3RpbWVsaW5lX2RmJT4lIA0KICBhcnJhbmdlKC1mYXZvcml0ZV9jb3VudCkgJT4lDQogIHRvcF9uKDUsIGZhdm9yaXRlX2NvdW50KSAlPiUgDQogIHNlbGVjdChjcmVhdGVkX2F0LCBzY3JlZW5fbmFtZSwgdGV4dCwgZmF2b3JpdGVfY291bnQpDQoNCkdvdmVybm1lbnRaQV9tb3N0X2xpa2VkX3R3ZWV0cyA8LSANCiAgR292ZXJubWVudFpBX2xpa2VkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KR292WkFfbGlrZV92YWwgPC0gDQogIHJiaW5kKGMoJzFzdCBNb3N0IExpa2VkIFR3ZWV0JywNCiAgICAgICAgICAnMm5kIE1vc3QgTGlrZWQgVHdlZXQnLCANCiAgICAgICAgICAnM3JkIE1vc3QgTGlrZWQgVHdlZXQnLCANCiAgICAgICAgICAnNHRoIE1vc3QgTGlrZWQgVHdlZXQnLCANCiAgICAgICAgICAnNXRoIE1vc3QgTGlrZWQgVHdlZXQnKSwNCiAgICAgICAgYyhHb3Zlcm5tZW50WkFfbW9zdF9saWtlZF90d2VldHMkdGV4dFsxXSwNCiAgICAgICAgICBHb3Zlcm5tZW50WkFfbW9zdF9saWtlZF90d2VldHMkdGV4dFsyXSwNCiAgICAgICAgICBHb3Zlcm5tZW50WkFfbW9zdF9saWtlZF90d2VldHMkdGV4dFszXSwNCiAgICAgICAgICBHb3Zlcm5tZW50WkFfbW9zdF9saWtlZF90d2VldHMkdGV4dFs0XSwNCiAgICAgICAgICBHb3Zlcm5tZW50WkFfbW9zdF9saWtlZF90d2VldHMkdGV4dFs1XSkpDQoNCiNUT1AgSEFTSFRBRw0KR292ZXJubWVudFpBX2RmX2hhc2h0YWdzIDwtIA0KICBHb3Zlcm5tZW50WkFfdGltZWxpbmVfZGYgJT4lIA0KICB1bm5lc3RfdG9rZW5zKGhhc2h0YWcsIHRleHQsICJ0d2VldHMiLCB0b19sb3dlciA9IEZBTFNFKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaGFzaHRhZywgIl4jIikpICU+JQ0KICBjb3VudChoYXNodGFnLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQojVE9QIE1FTlRJT05TDQpHb3Zlcm5tZW50WkFfbWVudGlvbnMgPC0NCiAgR292ZXJubWVudFpBX3RpbWVsaW5lX2RmICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNUT1AgMTAgd29yZHMNCkdvdmVybm1lbnRaQV9kZl93b3JkcyA8LSANCiAgR292ZXJubWVudFpBX3RpbWVsaW5lX2RmICU+JQ0KICBtdXRhdGUodGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICImYW1wO3wmbHQ7fCZndDsiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJcXHM/KGZ8aHQpKHRwKShzPykoOi8vKShbXlxcLl0pW1xcLnwvXShcXFMpIiksDQogIHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiW15ceDAxLVx4N0ZdIikpICU+JSANCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0LCB0b2tlbiA9ICJ0d2VldHMiKSAlPiUNCiAgZmlsdGVyKCF3b3JkICVpbiUgc3RvcF93b3JkcyR3b3JkLA0KICAhd29yZCAlaW4lIHN0cl9yZW1vdmVfYWxsKHN0b3Bfd29yZHMkd29yZCwgIiciKSwNCiAgc3RyX2RldGVjdCh3b3JkLCAiW2Etel0iKSwNCiAgIXN0cl9kZXRlY3Qod29yZCwgIl4jIiksIA0KICAhc3RyX2RldGVjdCh3b3JkLCAiQFxcUysiKSkgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNURklERg0KdGlkeV9Hb3Zlcm5tZW50WkFfdGZpZGYgPC0gDQogIEdvdmVybm1lbnRaQV90aW1lbGluZV9kZiAlPiUNCiAgICBzZWxlY3QoY3JlYXRlZF9hdCx0ZXh0KSAlPiUNCiAgICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KSAlPiUNCiAgICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICAgICBjb3VudCh3b3JkLCBjcmVhdGVkX2F0KSAlPiUNCiAgICAgICAgICAgICAgYmluZF90Zl9pZGYod29yZCwgY3JlYXRlZF9hdCwgbikNCg0KdG9wX0dvdmVybm1lbnRaQV90ZmlkZiA8LQ0KICB0aWR5X0dvdmVybm1lbnRaQV90ZmlkZiAlPiUNCiAgYXJyYW5nZShkZXNjKHRmX2lkZikpDQoNCnRvcF9Hb3Zlcm5tZW50WkFfdGZpZGYkd29yZFsxXQ0KYGBgDQoNCmBgYHtyIENMRUFOSU5HIEhFQUxUSDI0LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQoNCiMgU2FtZSBjbGVhbmluZyBwcm9jZXNzIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlyc3QgY2xlYW5pbmcgY2h1bmsNCg0KaGVhbHRoMjRfY29ycHVzIDwtIA0KICBDb3JwdXMoVmVjdG9yU291cmNlKGFzLnZlY3RvcihoZWFsdGgyNF90aW1lbGluZV9kZiR0ZXh0KSkpDQoNCnRpZHlfaGVhbHRoMjRfdHdlZXRzIDwtIA0KICBoZWFsdGgyNF90aW1lbGluZV9kZiAlPiUNCiAgICBzZWxlY3QoY3JlYXRlZF9hdCx0ZXh0KSAlPiUNCiAgICB1bm5lc3RfdG9rZW5zKCJ3b3JkIiwgdGV4dCkNCg0KdGlkeV9oZWFsdGgyNF90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KaGVhbHRoMjRfY29ycHVzIDwtIA0KICB0bV9tYXAoaGVhbHRoMjRfY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbmdsaXNoIikpDQoNCnRpZHlfaGVhbHRoMjRfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmhlYWx0aDI0X2NvcnB1cyA8LSANCiAgdG1fbWFwKGhlYWx0aDI0X2NvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZW1vdmVQdW5jdHVhdGlvbikpDQoNCnRpZHlfaGVhbHRoMjRfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmRhdGEoInN0b3Bfd29yZHMiKQ0KDQp0b3BfaGVhbHRoMjRfd29yZHM8LQ0KICAgdGlkeV9oZWFsdGgyNF90d2VldHMgJT4lDQogICAgICBhbnRpX2pvaW4oc3RvcF93b3JkcykgJT4lDQogICAgICAgIGZpbHRlcighKHdvcmQ9PSJodHRwcyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJydCJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJ0LmNvInwNCiAgICAgICAgICAgICAgICAgd29yZD09ImFtcCIpKSAlPiUNCiAgICAgICAgICAgIGNvdW50KHdvcmQpICU+JQ0KICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MobikpDQoNCg0KdGlkeV9oZWFsdGgyNF90ZmlkZjwtIA0KICBoZWFsdGgyNF90aW1lbGluZV9kZiAlPiUNCiAgICBzZWxlY3QoY3JlYXRlZF9hdCx0ZXh0KSAlPiUNCiAgICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KSAlPiUNCiAgICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICAgICBjb3VudCh3b3JkLCBjcmVhdGVkX2F0KSAlPiUNCiAgICAgICAgICAgICAgYmluZF90Zl9pZGYod29yZCwgY3JlYXRlZF9hdCwgbikNCg0KdG9wX2hlYWx0aDI0X3RmaWRmPC0NCiAgdGlkeV9oZWFsdGgyNF90ZmlkZiAlPiUNCiAgYXJyYW5nZShkZXNjKHRmX2lkZikpDQoNCnRvcF9oZWFsdGgyNF90ZmlkZiR3b3JkWzFdDQogDQojTU9TVCBTSEFSRUQgTElOS1MNCmhlYWx0aDI0X2RmX3NoYXJlZF9saW5rcyA8LSANCiAgaGVhbHRoMjRfdGltZWxpbmVfZGYgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVybHNfZXhwYW5kZWRfdXJsKSkgJT4lIA0KICBjb3VudCh1cmxzX2V4cGFuZGVkX3VybCwgc29ydCA9IFRSVUUpICU+JSANCiAgdG9wX24oNSkNCg0KI01PU1QgTElLRUQgVFdFRVQNCmhlYWx0aDI0X2RmX2xpa2VkX3R3ZWV0cyA8LSANCiAgaGVhbHRoMjRfdGltZWxpbmVfZGYgJT4lIA0KICBhcnJhbmdlKC1mYXZvcml0ZV9jb3VudCkgJT4lDQogIHRvcF9uKDUsIGZhdm9yaXRlX2NvdW50KSAlPiUgDQogIHNlbGVjdChjcmVhdGVkX2F0LCBzY3JlZW5fbmFtZSwgdGV4dCwgZmF2b3JpdGVfY291bnQpDQoNCmhlYWx0aDI0X21vc3RfbGlrZWRfdHdlZXRzIDwtDQogIGhlYWx0aDI0X2RmX2xpa2VkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KaGVhbHRoMjRfbGlrZV92YWwgPC0gDQogIHJiaW5kKGMoJzFzdCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzJuZCBNb3N0IExpa2VkIFR3ZWV0JywNCiAgICAgICAgICAnM3JkIE1vc3QgTGlrZWQgVHdlZXQnLA0KICAgICAgICAgICc0dGggTW9zdCBMaWtlZCBUd2VldCcsIA0KICAgICAgICAgICc1dGggTW9zdCBMaWtlZCBUd2VldCcpLA0KICAgICAgICBjKGhlYWx0aDI0X21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMV0sDQogICAgICAgICAgaGVhbHRoMjRfbW9zdF9saWtlZF90d2VldHMkdGV4dFsyXSwNCiAgICAgICAgICBoZWFsdGgyNF9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzNdLA0KICAgICAgICAgIGhlYWx0aDI0X21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNF0sDQogICAgICAgICAgaGVhbHRoMjRfbW9zdF9saWtlZF90d2VldHMkdGV4dFs1XSkpDQoNCg0KI1RPUCBIQVNIVEFHDQpoZWFsdGgyNF9kZl9oYXNodGFncyA8LSANCiAgaGVhbHRoMjRfdGltZWxpbmVfZGYgJT4lIA0KICB1bm5lc3RfdG9rZW5zKGhhc2h0YWcsIHRleHQsICJ0d2VldHMiLCB0b19sb3dlciA9IEZBTFNFKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaGFzaHRhZywgIl4jIikpICU+JQ0KICBjb3VudChoYXNodGFnLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBUV0VFVA0KDQpoZWFsdGgyNF9kZl9zaGFyZWRfdHdlZXRzIDwtIA0KICBoZWFsdGgyNF90aW1lbGluZV9kZiAlPiUgDQogIGFycmFuZ2UoLXJldHdlZXRfY291bnQpICU+JQ0KICBzbGljZSgxKSAlPiUgDQogIHNlbGVjdChjcmVhdGVkX2F0LCBzY3JlZW5fbmFtZSwgdGV4dCwgcmV0d2VldF9jb3VudCkNCg0KaGVhbHRoMjRfbW9zdF9zaGFyZWRfdHdlZXQgPC0gDQogIGhlYWx0aDI0X2RmX3NoYXJlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNCmhlYWx0aDI0X3NoYXJlX3ZhbCA8LSANCiAgcmJpbmQoYygnTW9zdCBTaGFyZWQgVHdlZXQgb2YgSGVhbHRoMjQnKSwNCiAgYyhoZWFsdGgyNF9tb3N0X3NoYXJlZF90d2VldCR0ZXh0KSkNCg0KIyB0b3AgbWVudGlvbnMNCg0KaGVhbHRoMjRfZGZfbWVudGlvbnMgPC0gDQogIGhlYWx0aDI0X3RpbWVsaW5lX2RmICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiMgdG9wIHdvcmRzDQoNCmhlYWx0aDI0X2RmX3dvcmRzIDwtIA0KICBoZWFsdGgyNF90aW1lbGluZV9kZiAlPiUNCiAgbXV0YXRlKHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiJmFtcDt8Jmx0O3wmZ3Q7IiksDQogIHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiXFxzPyhmfGh0KShzPykoOi8vKSh0cCkoW15cXC5dKVtcXC58L10oXFxTKSIpLA0KICB0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIlteXHgwMS1ceDdGXSIpKSAlPiUgDQogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCwgdG9rZW4gPSAidHdlZXRzIikgJT4lDQogIGZpbHRlcighd29yZCAlaW4lIHN0b3Bfd29yZHMkd29yZCwNCiAgIXdvcmQgJWluJSBzdHJfcmVtb3ZlX2FsbChzdG9wX3dvcmRzJHdvcmQsICInIiksDQogIHN0cl9kZXRlY3Qod29yZCwgIlthLXpdIiksDQogICFzdHJfZGV0ZWN0KHdvcmQsICJeIyIpLCANCiAgIXN0cl9kZXRlY3Qod29yZCwgIkBcXFMrIikpICU+JQ0KICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQpgYGANCg0KYGBge3IgU0Fnb3ZuZXdzIENMRUFOSU5HLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQoNCiMgU2FtZSBjbGVhbmluZyBwcm9jZXNzIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlyc3QgY2xlYW5pbmcgY2h1bmsNCg0KU0Fnb3ZuZXdzX2NvcnB1cyA8LSANCiAgQ29ycHVzKFZlY3RvclNvdXJjZShhcy52ZWN0b3IoU0Fnb3ZuZXdzX3RpbWVsaW5lX2RmJHRleHQpKSkNCg0KdGlkeV9TQWdvdm5ld3NfdHdlZXRzIDwtIA0KICBTQWdvdm5ld3NfdGltZWxpbmVfZGYgJT4lDQogICAgc2VsZWN0KGNyZWF0ZWRfYXQsdGV4dCkgJT4lDQogICAgdW5uZXN0X3Rva2Vucygid29yZCIsIHRleHQpDQoNCnRpZHlfU0Fnb3ZuZXdzX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpTQWdvdm5ld3NfY29ycHVzIDwtIA0KICB0bV9tYXAoU0Fnb3ZuZXdzX2NvcnB1cywgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiZW5nbGlzaCIpKQ0KDQp0aWR5X1NBZ292bmV3c190d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KU0Fnb3ZuZXdzX2NvcnB1cyA8LSANCiAgdG1fbWFwKFNBZ292bmV3c19jb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIocmVtb3ZlUHVuY3R1YXRpb24pKQ0KDQp0aWR5X1NBZ292bmV3c190d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KZGF0YSgic3RvcF93b3JkcyIpDQoNCnRvcF9TQWdvdm5ld3Nfd29yZHM8LQ0KICAgdGlkeV9TQWdvdm5ld3NfdHdlZXRzICU+JQ0KICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICBmaWx0ZXIoISh3b3JkPT0iaHR0cHMifA0KICAgICAgICAgICAgICAgICB3b3JkPT0icnQifA0KICAgICAgICAgICAgICAgICB3b3JkPT0idC5jbyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJhbXAiKSkgJT4lDQogICAgICAgICAgICBjb3VudCh3b3JkKSAlPiUNCiAgICAgICAgICAgICAgYXJyYW5nZShkZXNjKG4pKQ0KDQoNCnRpZHlfU0Fnb3ZuZXdzX3RmaWRmPC0gDQogIFNBZ292bmV3c190aW1lbGluZV9kZiAlPiUNCiAgICBzZWxlY3QoY3JlYXRlZF9hdCx0ZXh0KSAlPiUNCiAgICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KSAlPiUNCiAgICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICAgICBjb3VudCh3b3JkLCBjcmVhdGVkX2F0KSAlPiUNCiAgICAgICAgICAgICAgYmluZF90Zl9pZGYod29yZCwgY3JlYXRlZF9hdCwgbikNCg0KdG9wX1NBZ292bmV3c190ZmlkZjwtDQogIHRpZHlfU0Fnb3ZuZXdzX3RmaWRmICU+JQ0KICBhcnJhbmdlKGRlc2ModGZfaWRmKSkNCg0KdG9wX1NBZ292bmV3c190ZmlkZiR3b3JkWzFdDQoNCiNNT1NUIFNIQVJFRCBMSU5LUw0KU0Fnb3ZuZXdzX2RmX3NoYXJlZF9saW5rcyA8LSANCiAgU0Fnb3ZuZXdzX3RpbWVsaW5lX2RmICU+JSANCiAgZmlsdGVyKCFpcy5uYSh1cmxzX2V4cGFuZGVkX3VybCkpICU+JSANCiAgY291bnQodXJsc19leHBhbmRlZF91cmwsIHNvcnQgPSBUUlVFKSAlPiUgDQogIHRvcF9uKDUpDQoNCiNNT1NUIFNIQVJFRCBUV0VFVFMNClNBZ292bmV3c19kZl9zaGFyZWRfdHdlZXRzIDwtIA0KICBTQWdvdm5ld3NfdGltZWxpbmVfZGYgJT4lIA0KICBhcnJhbmdlKC1yZXR3ZWV0X2NvdW50KSAlPiUNCiAgc2xpY2UoMSkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIHJldHdlZXRfY291bnQpDQoNClNBZ292bmV3c19tb3N0X3NoYXJlZF90d2VldCA8LSANCiAgU0Fnb3ZuZXdzX2RmX3NoYXJlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNClNBZ292bmV3c19zaGFyZV92YWwgPC0gDQogIHJiaW5kKGMoJ01vc3QgU2hhcmVkIFR3ZWV0IG9mIFNBIEdvdmVybm1lbnQgTmV3cycpLA0KICAgICAgICBjKFNBZ292bmV3c19tb3N0X3NoYXJlZF90d2VldCR0ZXh0KSkNCg0KI01PU1QgTElLRUQgVFdFRVRTDQpTQWdvdm5ld3NfZGZfbGlrZWRfdHdlZXRzIDwtIA0KICBTQWdvdm5ld3NfdGltZWxpbmVfZGYlPiUgDQogIGFycmFuZ2UoLWZhdm9yaXRlX2NvdW50KSAlPiUNCiAgdG9wX24oNSwgZmF2b3JpdGVfY291bnQpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCBmYXZvcml0ZV9jb3VudCkNCg0KU0Fnb3ZuZXdzX21vc3RfbGlrZWRfdHdlZXRzIDwtDQogIFNBZ292bmV3c19kZl9saWtlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNClNBZ292bmV3c19saWtlX3ZhbCA8LQ0KICByYmluZChjKCcxc3QgTW9zdCBMaWtlZCBUd2VldCcsIA0KICAgICAgICAgICcybmQgTW9zdCBMaWtlZCBUd2VldCcsDQogICAgICAgICAgJzNyZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzR0aCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzV0aCBNb3N0IExpa2VkIFR3ZWV0JyksDQogICAgICAgIGMoU0Fnb3ZuZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMV0sDQogICAgICAgICAgU0Fnb3ZuZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMl0sDQogICAgICAgICAgU0Fnb3ZuZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbM10sDQogICAgICAgICAgU0Fnb3ZuZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNF0sDQogICAgICAgICAgU0Fnb3ZuZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNV0pKQ0KDQojVE9QIEhBU1RBR1MNClNBZ292bmV3c19kZl9oYXNodGFncyA8LSANCiAgU0Fnb3ZuZXdzX3RpbWVsaW5lX2RmICU+JSANCiAgdW5uZXN0X3Rva2VucyhoYXNodGFnLCB0ZXh0LCAidHdlZXRzIiwgdG9fbG93ZXIgPSBGQUxTRSkgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGhhc2h0YWcsICJeIyIpKSAlPiUNCiAgY291bnQoaGFzaHRhZywgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCg0KI01PU1QgTUVOVElPTlMNClNBZ292bmV3c19kZl9tZW50aW9ucyA8LSANCiAgU0Fnb3ZuZXdzX3RpbWVsaW5lX2RmICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNUT1AgV09SRFMNClNBZ292bmV3c19kZl93b3JkcyA8LSANCiAgU0Fnb3ZuZXdzX3RpbWVsaW5lX2RmICU+JQ0KICBtdXRhdGUodGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICImYW1wO3wmbHQ7fCZndDsiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJcXHM/KGZ8aHQpKHRwKSg6Ly8pKHM/KShbXlxcLl0pW1xcLnwvXShcXFMpIiksDQogIHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiW15ceDAxLVx4N0ZdIikpICU+JSANCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0LCB0b2tlbiA9ICJ0d2VldHMiKSAlPiUNCiAgZmlsdGVyKCF3b3JkICVpbiUgc3RvcF93b3JkcyR3b3JkLA0KICAhd29yZCAlaW4lIHN0cl9yZW1vdmVfYWxsKHN0b3Bfd29yZHMkd29yZCwgIiciKSwNCiAgc3RyX2RldGVjdCh3b3JkLCAiW2Etel0iKSwNCiAgIXN0cl9kZXRlY3Qod29yZCwgIl4jIiksIA0KICAhc3RyX2RldGVjdCh3b3JkLCAiQFxcUysiKSkgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCmBgYA0KDQpgYGB7ciBjbGVhbl9zYWJjX2RhdGEsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCg0KIyBTYW1lIGNsZWFuaW5nIHByb2Nlc3MgYXMgZGVzY3JpYmVkIGluIHRoZSBmaXJzdCBjbGVhbmluZyBjaHVuaw0KDQpzYWJjX25ld3NfY29ycHVzIDwtIA0KICBDb3JwdXMoVmVjdG9yU291cmNlKGFzLnZlY3RvcihzYWJjX25ld3NfdGltZWxpbmVfZGYkdGV4dCkpKQ0KDQp0aWR5X3NhYmNfdHdlZXRzIDwtIA0KICBzYWJjX25ld3NfdGltZWxpbmVfZGYgJT4lDQogICAgc2VsZWN0KGNyZWF0ZWRfYXQsdGV4dCkgJT4lDQogICAgdW5uZXN0X3Rva2Vucygid29yZCIsIHRleHQpDQoNCnRpZHlfc2FiY190d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0Kc2FiY19uZXdzX2NvcnB1cyA8LSANCiAgdG1fbWFwKHNhYmNfbmV3c19jb3JwdXMsIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoImVuZ2xpc2giKSkNCg0KdGlkeV9zYWJjX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpzYWJjX25ld3NfY29ycHVzIDwtIA0KICB0bV9tYXAoc2FiY19uZXdzX2NvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZW1vdmVQdW5jdHVhdGlvbikpDQoNCnRpZHlfc2FiY190d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KZGF0YSgic3RvcF93b3JkcyIpDQoNCnRvcF9zYWJjX3dvcmRzPC0NCiAgIHRpZHlfc2FiY190d2VldHMgJT4lDQogICAgICBhbnRpX2pvaW4oc3RvcF93b3JkcykgJT4lDQogICAgICAgIGZpbHRlcighKHdvcmQ9PSJodHRwcyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJydCJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJ0LmNvInwNCiAgICAgICAgICAgICAgICAgd29yZD09ImFtcCIpKSAlPiUNCiAgICAgICAgICAgIGNvdW50KHdvcmQpICU+JQ0KICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MobikpDQoNCnRpZHlfc2FiY190ZmlkZjwtIA0KICBzYWJjX25ld3NfdGltZWxpbmVfZGYgJT4lDQogICAgc2VsZWN0KGNyZWF0ZWRfYXQsdGV4dCkgJT4lDQogICAgICB1bm5lc3RfdG9rZW5zKCJ3b3JkIiwgdGV4dCkgJT4lDQogICAgICAgIGFudGlfam9pbihzdG9wX3dvcmRzKSAlPiUNCiAgICAgICAgICAgY291bnQod29yZCwgY3JlYXRlZF9hdCkgJT4lDQogICAgICAgICAgICAgIGJpbmRfdGZfaWRmKHdvcmQsIGNyZWF0ZWRfYXQsIG4pDQoNCnRvcF9zYWJjX3RmaWRmPC0NCiAgdGlkeV9zYWJjX3RmaWRmICU+JQ0KICBhcnJhbmdlKGRlc2ModGZfaWRmKSkNCg0KdG9wX3NhYmNfdGZpZGYkd29yZFsxXQ0KDQoNCiNNT1NUIEZSRVFVRU5UTFkgU0hBUkVEIExJTktTDQpzYWJjX25ld3Nfc2hhcmVkX2xpbmtzIDwtIA0KICBzYWJjX25ld3NfdGltZWxpbmVfZGYgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVybHNfZXhwYW5kZWRfdXJsKSkgJT4lIA0KICBjb3VudCh1cmxzX2V4cGFuZGVkX3VybCwgc29ydCA9IFRSVUUpICU+JSANCiAgdG9wX24oNSkNCg0KI01PU1QgRlJFUVVFTlRMWSBTSEFSRUQgVFdFRVRTDQpzYWJjX25ld3Nfc2hhcmVkX3R3ZWV0cyA8LSANCiAgc2FiY19uZXdzX3RpbWVsaW5lX2RmICU+JSANCiAgYXJyYW5nZSgtcmV0d2VldF9jb3VudCkgJT4lDQogIHNsaWNlKDEpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCByZXR3ZWV0X2NvdW50KQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBUV0VFVA0KDQpzYWJjX25ld3NfZGZfc2hhcmVkX3R3ZWV0cyA8LSANCiAgc2FiY19uZXdzX3RpbWVsaW5lX2RmICU+JSANCiAgYXJyYW5nZSgtcmV0d2VldF9jb3VudCkgJT4lDQogIHNsaWNlKDEpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCByZXR3ZWV0X2NvdW50KQ0KDQpzYWJjX25ld3NfbW9zdF9zaGFyZWRfdHdlZXQgPC0NCiAgc2FiY19uZXdzX2RmX3NoYXJlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNCnNhYmNfc2hhcmVfdmFsIDwtIA0KICByYmluZChjKCdNb3N0IFNoYXJlZCBUd2VldCBvZiBTQUJDIE5ld3MnKSwNCiAgICAgICAgYyhzYWJjX25ld3NfbW9zdF9zaGFyZWRfdHdlZXQkdGV4dCkpDQoNCiNNT1NUIExJS0VEIFRXRUVUUw0Kc2FiY19uZXdzX2xpa2VkX3R3ZWV0cyA8LSANCiAgc2FiY19uZXdzX3RpbWVsaW5lX2RmJT4lIA0KICBhcnJhbmdlKC1mYXZvcml0ZV9jb3VudCkgJT4lDQogIHRvcF9uKDUsIGZhdm9yaXRlX2NvdW50KSAlPiUgDQogIHNlbGVjdChjcmVhdGVkX2F0LCBzY3JlZW5fbmFtZSwgdGV4dCwgZmF2b3JpdGVfY291bnQpDQoNCiNNT1NUIExJS0VEIFRXRUVUDQpzYWJjX25ld3NfZGZfbGlrZWRfdHdlZXRzIDwtIA0KICBzYWJjX25ld3NfdGltZWxpbmVfZGYgJT4lIA0KICBhcnJhbmdlKC1mYXZvcml0ZV9jb3VudCkgJT4lDQogIHRvcF9uKDUsIGZhdm9yaXRlX2NvdW50KSAlPiUgDQogIHNlbGVjdChjcmVhdGVkX2F0LCBzY3JlZW5fbmFtZSwgdGV4dCwgZmF2b3JpdGVfY291bnQpDQoNCnNhYmNfbmV3c19tb3N0X2xpa2VkX3R3ZWV0cyA8LQ0KICBzYWJjX25ld3NfZGZfbGlrZWRfdHdlZXRzICU+JQ0KICBzZWxlY3QoInRleHQiKQ0KDQpzYWJjX2xpa2VfdmFsIDwtDQogIHJiaW5kKGMoJzFzdCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzJuZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzNyZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzR0aCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzV0aCBNb3N0IExpa2VkIFR3ZWV0JyksDQogICAgICAgIGMoc2FiY19uZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMV0sDQogICAgICAgICAgc2FiY19uZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMl0sDQogICAgICAgICAgc2FiY19uZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbM10sDQogICAgICAgICAgc2FiY19uZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNF0sDQogICAgICAgICAgc2FiY19uZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNV0pKQ0KDQojVE9QIEhBU0hUQUdTDQpzYWJjX25ld3NfaGFzaHRhZ3MgPC0gDQogIHNhYmNfbmV3c190aW1lbGluZV9kZiAlPiUgDQogIHVubmVzdF90b2tlbnMoaGFzaHRhZywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChoYXNodGFnLCAiXiMiKSkgJT4lDQogIGNvdW50KGhhc2h0YWcsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNTQUJDTmV3cyBzaGFyZWQgdHdlZXQgQ2xlYW5pbmcNClNBQkNfbmV3c19tb3N0X3NoYXJlZF90d2VldCA8LQ0KICBzYWJjX25ld3Nfc2hhcmVkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0Kc2FiY19zaGFyZV92YWwgPC0NCiAgcmJpbmQoYygnTW9zdCBTaGFyZWQgVHdlZXQgb2YgU0FCQyBOZXdzJyksDQogICAgICAgIGMoU0FCQ19uZXdzX21vc3Rfc2hhcmVkX3R3ZWV0JHRleHQpKQ0KDQojVE9QIE1FTlRJT05TDQpzYWJjX25ld3NfbWVudGlvbnMgPC0gDQogIHNhYmNfbmV3c190aW1lbGluZV9kZiAlPiUgDQogIHVubmVzdF90b2tlbnMobWVudGlvbnMsIHRleHQsICJ0d2VldHMiLCB0b19sb3dlciA9IEZBTFNFKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QobWVudGlvbnMsICJeQCIpKSAlPiUgDQogIGNvdW50KG1lbnRpb25zLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQojVE9QIFdPUkRTDQpzYWJjX25ld3Nfd29yZHMgPC0gDQogIHNhYmNfbmV3c190aW1lbGluZV9kZiAlPiUNCiAgbXV0YXRlKHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiJmFtcDt8Jmx0O3wmZ3Q7IiksDQogIHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiXFxzPyhmfGh0KShzPykoOi8vKSh0cCkoW15cXC5dKVtcXC58L10oXFxTKSIpLA0KICB0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIlteXHgwMS1ceDdGXSIpKSAlPiUgDQogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCwgdG9rZW4gPSAidHdlZXRzIikgJT4lDQogIGZpbHRlcighd29yZCAlaW4lIHN0b3Bfd29yZHMkd29yZCwNCiAgIXdvcmQgJWluJSBzdHJfcmVtb3ZlX2FsbChzdG9wX3dvcmRzJHdvcmQsICInIiksDQogIHN0cl9kZXRlY3Qod29yZCwgIlthLXpdIiksDQogICFzdHJfZGV0ZWN0KHdvcmQsICJeIyIpLCANCiAgIXN0cl9kZXRlY3Qod29yZCwgIkBcXFMrIikpICU+JQ0KICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQpgYGANCg0KYGBge3IgZU5DQSBDTEVBTklORywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KDQojIFNhbWUgY2xlYW5pbmcgcHJvY2VzcyBhcyBkZXNjcmliZWQgaW4gdGhlIGZpcnN0IGNsZWFuaW5nIGNodW5rDQoNCmVuY2FfbmV3c19jb3JwdXMgPC0gDQogIENvcnB1cyhWZWN0b3JTb3VyY2UoYXMudmVjdG9yKGVuY2FfdGltZWxpbmVfZGYkdGV4dCkpKQ0KDQp0aWR5X2VuY2FfdHdlZXRzIDwtIA0KICBlbmNhX3RpbWVsaW5lX2RmICU+JQ0KICAgIHNlbGVjdChjcmVhdGVkX2F0LHRleHQpICU+JQ0KICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KQ0KDQp0aWR5X2VuY2FfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmVuY2FfbmV3c19jb3JwdXMgPC0gDQogIHRtX21hcChlbmNhX25ld3NfY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbmdsaXNoIikpDQoNCnRpZHlfZW5jYV90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KZW5jYV9uZXdzX2NvcnB1cyA8LSANCiAgdG1fbWFwKGVuY2FfbmV3c19jb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIocmVtb3ZlUHVuY3R1YXRpb24pKQ0KDQp0aWR5X2VuY2FfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmRhdGEoInN0b3Bfd29yZHMiKQ0KDQp0b3BfZW5jYV93b3JkczwtDQogICB0aWR5X2VuY2FfdHdlZXRzICU+JQ0KICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICBmaWx0ZXIoISh3b3JkPT0iaHR0cHMifA0KICAgICAgICAgICAgICAgICB3b3JkPT0icnQifA0KICAgICAgICAgICAgICAgICB3b3JkPT0idC5jbyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJhbXAiKSkgJT4lDQogICAgICAgICAgICBjb3VudCh3b3JkKSAlPiUNCiAgICAgICAgICAgICAgYXJyYW5nZShkZXNjKG4pKQ0KDQp0aWR5X2VuY2FfdGZpZGY8LSANCiAgZW5jYV90aW1lbGluZV9kZiAlPiUNCiAgICBzZWxlY3QoY3JlYXRlZF9hdCx0ZXh0KSAlPiUNCiAgICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KSAlPiUNCiAgICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICAgICBjb3VudCh3b3JkLCBjcmVhdGVkX2F0KSAlPiUNCiAgICAgICAgICAgICAgYmluZF90Zl9pZGYod29yZCwgY3JlYXRlZF9hdCwgbikNCg0KdG9wX2VuY2FfdGZpZGY8LQ0KICB0aWR5X2VuY2FfdGZpZGYgJT4lDQogIGFycmFuZ2UoZGVzYyh0Zl9pZGYpKQ0KDQp0b3BfZW5jYV90ZmlkZiR3b3JkWzFdDQoNCiNNT1NUIFNIQVJFRCBMSU5LUw0KZW5jYV9uZXdzX3NoYXJlZF9saW5rcyA8LSANCiAgZW5jYV90aW1lbGluZV9kZiAlPiUgDQogIGZpbHRlcighaXMubmEodXJsc19leHBhbmRlZF91cmwpKSAlPiUgDQogIGNvdW50KHVybHNfZXhwYW5kZWRfdXJsLCBzb3J0ID0gVFJVRSkgJT4lIA0KICB0b3Bfbig1KQ0KDQojVE9QIFNIQVJFRCBUV0VFVFMNCmVuY2FfbmV3c19zaGFyZWRfdHdlZXRzIDwtIA0KICBlbmNhX3RpbWVsaW5lX2RmICU+JSANCiAgYXJyYW5nZSgtcmV0d2VldF9jb3VudCkgJT4lDQogIHNsaWNlKDEpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCByZXR3ZWV0X2NvdW50KQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBUV0VFVFMNCg0KZW5jYV9uZXdzX3NoYXJlZF90d2VldHMgPC0gDQogIGVuY2FfdGltZWxpbmVfZGYgJT4lIA0KICBhcnJhbmdlKC1yZXR3ZWV0X2NvdW50KSAlPiUNCiAgc2xpY2UoMSkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIHJldHdlZXRfY291bnQpDQoNCmVuY2FfbmV3c19tb3N0X3NoYXJlZF90d2VldCA8LQ0KICBlbmNhX25ld3Nfc2hhcmVkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KZW5jYV9zaGFyZV92YWwgPC0gDQogIHJiaW5kKGMoJ01vc3QgU2hhcmVkIFR3ZWV0IG9mIGVOQ0EnKSwNCiAgICAgICAgYyhlbmNhX25ld3NfbW9zdF9zaGFyZWRfdHdlZXQkdGV4dCkpDQoNCiNNT1NUIExJS0VEIFRXRUVUUw0KZW5jYV9uZXdzX2xpa2VkX3R3ZWV0cyA8LSANCiAgZW5jYV90aW1lbGluZV9kZiU+JSANCiAgYXJyYW5nZSgtZmF2b3JpdGVfY291bnQpICU+JQ0KICB0b3Bfbig1LCBmYXZvcml0ZV9jb3VudCkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIGZhdm9yaXRlX2NvdW50KQ0KDQplbmNhX25ld3NfbW9zdF9saWtlZF90d2VldHMgPC0gDQogIGVuY2FfbmV3c19saWtlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNCmVuY2FfbGlrZV92YWwgPC0gDQogIHJiaW5kKGMoJzFzdCBNb3N0IExpa2VkIFR3ZWV0JywNCiAgICAgICAgICAnMm5kIE1vc3QgTGlrZWQgVHdlZXQnLCANCiAgICAgICAgICAnM3JkIE1vc3QgTGlrZWQgVHdlZXQnLA0KICAgICAgICAgICc0dGggTW9zdCBMaWtlZCBUd2VldCcsIA0KICAgICAgICAgICc1dGggTW9zdCBMaWtlZCBUd2VldCcpLA0KICAgICAgICBjKGVuY2FfbmV3c19tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzFdLA0KICAgICAgICAgIGVuY2FfbmV3c19tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzJdLA0KICAgICAgICAgIGVuY2FfbmV3c19tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzNdLA0KICAgICAgICAgIGVuY2FfbmV3c19tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzRdLA0KICAgICAgICAgIGVuY2FfbmV3c19tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzVdKSkNCg0KI1RPUCBIQVNIVEFHUw0KZW5jYV9uZXdzX2hhc2h0YWdzIDwtIA0KICBlbmNhX3RpbWVsaW5lX2RmICU+JSANCiAgdW5uZXN0X3Rva2VucyhoYXNodGFnLCB0ZXh0LCAidHdlZXRzIiwgdG9fbG93ZXIgPSBGQUxTRSkgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGhhc2h0YWcsICJeIyIpKSAlPiUNCiAgY291bnQoaGFzaHRhZywgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCg0KI1RvcCB3b3JkcyBwbG90DQplbmNhX25ld3Nfd29yZHMgPC0gDQogIGVuY2FfdGltZWxpbmVfZGYgJT4lDQogIG11dGF0ZSh0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIiZhbXA7fCZsdDt8Jmd0OyIpLA0KICB0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIlxccz8ocz8pKGZ8aHQpKHRwKSg6Ly8pKFteXFwuXSlbXFwufC9dKFxcUykiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJbXlx4MDEtXHg3Rl0iKSkgJT4lIA0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQsIHRva2VuID0gInR3ZWV0cyIpICU+JQ0KICBmaWx0ZXIoIXdvcmQgJWluJSBzdG9wX3dvcmRzJHdvcmQsDQogICF3b3JkICVpbiUgc3RyX3JlbW92ZV9hbGwoc3RvcF93b3JkcyR3b3JkLCAiJyIpLA0KICBzdHJfZGV0ZWN0KHdvcmQsICJbYS16XSIpLA0KICAhc3RyX2RldGVjdCh3b3JkLCAiXiMiKSwgDQogICFzdHJfZGV0ZWN0KHdvcmQsICJAXFxTKyIpKSAlPiUNCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCg0KI01FTlRJT05TIA0KZW5jYV9uZXdzX21lbnRpb25zIDwtIA0KICBlbmNhX3RpbWVsaW5lX2RmICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCg0KYGBgDQoNCmBgYHtyIGNsZWFuX2FsbF9tZWRpYV9kYXRhLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQoNCiMgU2FtZSBjbGVhbmluZyBwcm9jZXNzIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlyc3QgY2xlYW5pbmcgY2h1bmsNCg0KIyMgSm9pbmluZyBhbGwgdGVuIG1lZGlhIHNvdXJjZXMgVHdpdHRlciBkYXRhDQoNCmNvbXBsZXRlX2RhdGFfc291cmNlX2RmIDwtDQogIGJoZWtpc2lzYV90d2VldHMgJT4lDQogIGZ1bGxfam9pbihld25yZXBvcnRlcl90d2VldHMpICU+JQ0KICBmdWxsX2pvaW4oR292ZXJubWVudFpBX3RpbWVsaW5lX2RmKSAlPiUNCiAgZnVsbF9qb2luKGhlYWx0aHphX3R3ZWV0cykgJT4lDQogIGZ1bGxfam9pbihuZXdzMjRfdHdlZXRzKSAlPiUNCiAgZnVsbF9qb2luKG5pY2RfdHdlZXRzKSAlPiUNCiAgZnVsbF9qb2luKHNhYmNfbmV3c190aW1lbGluZV9kZikgJT4lDQogIGZ1bGxfam9pbihlbmNhX3RpbWVsaW5lX2RmKSAlPiUNCiAgZnVsbF9qb2luKFNBZ292bmV3c190aW1lbGluZV9kZikgJT4lDQogIGZ1bGxfam9pbihoZWFsdGgyNF90aW1lbGluZV9kZikNCg0KYWxsX21lZGlhX2NvcnB1cyA8LSANCiAgQ29ycHVzKFZlY3RvclNvdXJjZQ0KICAgICAgICAgKGFzLnZlY3Rvcg0KICAgICAgICAgIChjb21wbGV0ZV9kYXRhX3NvdXJjZV9kZiR0ZXh0KSkpDQoNCnRpZHlfYWxsX21lZGlhX3R3ZWV0cyA8LSANCiAgY29tcGxldGVfZGF0YV9zb3VyY2VfZGYgJT4lDQogICAgc2VsZWN0KGNyZWF0ZWRfYXQsdGV4dCkgJT4lDQogICAgdW5uZXN0X3Rva2Vucygid29yZCIsIHRleHQpDQoNCnRpZHlfYWxsX21lZGlhX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQphbGxfbWVkaWFfY29ycHVzIDwtIA0KICB0bV9tYXAoYWxsX21lZGlhX2NvcnB1cywgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiZW5nbGlzaCIpKQ0KDQp0aWR5X2FsbF9tZWRpYV90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KYWxsX21lZGlhX2NvcnB1cyA8LSANCiAgdG1fbWFwKGFsbF9tZWRpYV9jb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIocmVtb3ZlUHVuY3R1YXRpb24pKQ0KDQp0aWR5X2FsbF9tZWRpYV90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KZGF0YSgic3RvcF93b3JkcyIpDQoNCnRvcF9hbGxfbWVkaWFfd29yZHM8LQ0KICAgdGlkeV9hbGxfbWVkaWFfdHdlZXRzICU+JQ0KICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICBmaWx0ZXIoISh3b3JkPT0iaHR0cHMifA0KICAgICAgICAgICAgICAgICB3b3JkPT0icnQifA0KICAgICAgICAgICAgICAgICB3b3JkPT0idC5jbyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJhbXAiKSkgJT4lDQogICAgICAgICAgICBjb3VudCh3b3JkKSAlPiUNCiAgICAgICAgICAgICAgYXJyYW5nZShkZXNjKG4pKQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBUV0VFVFMNCg0KbWVkaWFfc2hhcmVkX3R3ZWV0cyA8LSANCiAgY29tcGxldGVfZGF0YV9zb3VyY2VfZGYgJT4lIA0KICBhcnJhbmdlKC1yZXR3ZWV0X2NvdW50KSAlPiUNCiAgc2xpY2UoMSkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIHJldHdlZXRfY291bnQpDQoNCm1lZGlhX21vc3Rfc2hhcmVkX3R3ZWV0IDwtDQogIG1lZGlhX3NoYXJlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNCm1lZGlhX3NoYXJlX3ZhbCA8LSANCiAgcmJpbmQoYygnTW9zdCBTaGFyZWQgVHdlZXQgb2YgYWxsIG1lZGlhJyksDQogICAgICAgIGMoZW5jYV9uZXdzX21vc3Rfc2hhcmVkX3R3ZWV0JHRleHQpKQ0KDQojTU9TVCBMSUtFRCBUV0VFVFMNCm1lZGlhX2xpa2VkX3R3ZWV0cyA8LSANCiAgY29tcGxldGVfZGF0YV9zb3VyY2VfZGYlPiUgDQogIGFycmFuZ2UoLWZhdm9yaXRlX2NvdW50KSAlPiUNCiAgdG9wX24oNSwgZmF2b3JpdGVfY291bnQpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCBmYXZvcml0ZV9jb3VudCkNCg0KbWVkaWFfbW9zdF9saWtlZF90d2VldHMgPC0gDQogIG1lZGlhX2xpa2VkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KbWVkaWFfbGlrZV92YWwgPC0gDQogIHJiaW5kKGMoJzFzdCBNb3N0IExpa2VkIFR3ZWV0JywNCiAgICAgICAgICAnMm5kIE1vc3QgTGlrZWQgVHdlZXQnLCANCiAgICAgICAgICAnM3JkIE1vc3QgTGlrZWQgVHdlZXQnLA0KICAgICAgICAgICc0dGggTW9zdCBMaWtlZCBUd2VldCcsIA0KICAgICAgICAgICc1dGggTW9zdCBMaWtlZCBUd2VldCcpLA0KICAgICAgICBjKG1lZGlhX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMV0sDQogICAgICAgICAgbWVkaWFfbW9zdF9saWtlZF90d2VldHMkdGV4dFsyXSwNCiAgICAgICAgICBtZWRpYV9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzNdLA0KICAgICAgICAgIG1lZGlhX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNF0sDQogICAgICAgICAgbWVkaWFfbW9zdF9saWtlZF90d2VldHMkdGV4dFs1XSkpDQpgYGANCg0KIyBSZXBvcnQgUmVzdWx0czoNCg0KIyMgTWluaW11bSBSZXF1aXJlbWVudHM6DQoNCg0KIyMgQkhFS0lTSVNBIChAQmhla2lzaXNhX01HKQ0KDQoNCkJoZWtpc2lzYSBpcyBhbiBpbmRlcGVuZGVudCBDZW50cmUgZm9yIEhlYWx0aCBKb3VybmFsaXNtLiBUaGUgaW5mb3JtYXRpb24gY29udmV5ZWQgdGhyb3VnaCB0aGVtIGlzIHVzZWQgYW5kIHB1Ymxpc2hlZCBieSBudW1lcm91cyBvdGhlciBhY2NyZWRpdGVkIG5ld3Mgc291cmNlcyBhbmQgbWVkaWEgYWdlbnRzLiBUaGUgQ09WSUQtMTkgdmlydXMgaXMgYSBwYW5kZW1pYywgd2hpY2ggY29uY2VybnMgdGhlIGhlYWx0aGNhcmUgc2VjdG9yIG9mIFNvdXRoIEFmcmljYSBhcyBhIHdob2xlLCB0aGUgcm9sZSBvZiBCaGVraXNpc2EgYXMgYW4gaW5mb3JtYXRpdmUgcGxhdGZvcm0gc2VlbXMgaW1wZXJhdGl2ZSB3aXRoaW4gdGhpcyBjb250ZXh0Lg0KDQpgYGB7ciBCaGVrIFBMT1RTLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCg0KI0JoZWtpc2lzYSBUaW1lbGluZSBGcmVxdWVuY3kNCnRzX3Bsb3QoYmhla2lzaXNhX3R3ZWV0cywgY29sb3IgPSAiIzAwQURCNSIsIHNpemUgPSAxKSArDQogIHRoZW1lX2hjKCkgKw0KICBsYWJzKHRpdGxlID0gIkZyZXF1ZW5jeSBvZiBCaGVraXNpc2EgVHdlZXRzIiwgDQogICAgICAgY2FwdGlvbiA9ICJVcGRhdGVkOiBKdWx5IDIwMjEiKSArDQogIHlsYWIoIkZyZXF1ZW5jeSIpICsNCiAgeGxhYihOVUxMKQ0KYGBgDQpJbiB0aGUgbGFzdCBtb250aCwgdGhlcmUgaGFzIG5vdCBiZWVuIGFueSBzaWduaWZpY2FudCBjaGFuZ2VzIGluIHRoZSBmcmVxdWVuY3kgb2YgdHdlZXRzIA0KYnkgQmhla2lzaXNhLiBFeGNlcHQgZm9yIGEgcmFwaWQgc3Bpa2UgYXQgdGhlIGVuZCBvZiBKdW5lLCB3aGljaCBjb3VsZCBoYXZlIGEgY29ycmVsYXRpb24gdG8gdGhlIENvdmlkLTE5IHRoaXJkIHdhdmUuDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IGxpa2VkIFR3ZWV0cyBQbG90DQpiaGVrX2ZpZzEgPC0gDQogIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI1MCwgNDAwKSwNCiAgaGVhZGVyID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBjKCc8Yj5Nb3N0IExpa2VkIFR3ZWV0czwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBCaGVrX2xpa2VfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0KYmhla19maWcxDQoNCmBgYA0KMXN0IG1vc3QgbGlrZWQgdHdlZXQgb2YgQmhla2lzaXNhIHdhcyBhIHR3ZWV0IGNvbmNlcm5pbmcgYSBDb3ZpZCAtMTkgd2ViaW5hciBob3N0ZWQgYnkgQmhla2lzaXNhLCB3aXRoIHRoZSBob3N0IGJlaW5nIHRoZWlyIEVkaXRvci1pbi1jaGllZiwgTWlhIE1hbGFuLiAybmQgTW9zdCBsaWtlZCB0d2VldCBpcyBhIHR3ZWV0IGNvbmNlcm5pbmcgdGhlIGluZHVjdGlvbiBvZiBhIG5ldyB0eXBlIG9mIEFUTSBtYWNoaW5lLCB3aGljaCBpcyBub3QgcmVsZXZhbnQgdG8gdGhpcyByZXBvcnQuIDNyZCBiZWluZyBhIHR3ZWV0IG1lbnRpb25pbmcgdGhlIEJoZWtpc2lzYSBob3N0ZWQgd2ViaW5hciByZWdhcmRpbmcgdGhlIENvdmlkIHBhbmRlbWljIHdpdGggYSBzZWN0aW9uIG1lbnRpb25pbmcgY292aWQgdmFjY2luYXRpb24gc2l0ZXMuIFRoZSA0dGggbW9zdCBsaWtlZCB0d2VldCBjb252ZXllZCBpbmZvcm1hdGlvbiBwZXJ0YWluaW5nIG5hdGlvbmFsIENvdmlkIHN0YXRpc3RpY3MgYW5kIHRoZSA1dGggZGVzY3JpYmVkIHRoZSBzaXR1YXRpb24gcmVnYXJkaW5nIEpvaG5zb24gJiBKb2huc29uIHZhY2NpbmF0aW9ucyBmb3IgdGVhY2hlcnMuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNIYXNodGFnIHBsb3QNCmdncGxvdChiaGVraXNpc2FfZGZfaGFzaHRhZ3MsIGFlcyh4ID0gcmVvcmRlcihoYXNodGFnLCBuKSwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgSGFzaHRhZ3MgaW4gQmhla2lzaXNhIFR3ZWV0cyIpDQpgYGANClRvcCBoYXNodGFncyBvZiBCaGVraXNpc2EgYXJlIHN0cnVjdHVyZWQgYXMgZm9sbG93czogMS4g4oCYI0NPVklEMTlTQeKAmSwgMi4g4oCYI0NPVklEMTnigJksIDMuIOKAmCNCaGVraXNpc2FSZXNvdXJjZeKAmSwgNC4g4oCYI3ZhY2NpbmXigJksIDUuIOKAmCNWYWNjaW5lUm9sbG91dFNB4oCZIDYuIOKAmCNDT1ZJRDE5aW5TQeKAmSwgNy4g4oCYI1BmaXplcuKAmSwgOC4g4oCYI0puSuKAmSA5LiDigJgjQ09WSUTigJksIDEwLiDigJgjdmFjY2luZXPigJkuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI01vc3QgZnJlcXVlbnRseSBzaGFyZWQgdHdlZXQgcGxvdA0KYmhla19maWcgPC0gDQogIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI4MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgRnJlcXVlbnRseSBTaGFyZWQgVHdlZXQ8L2I+PGJyPmFzIG9mIEp1bHkgMjAyMScsICc8Yj5Ud2VldCBEZXNjcmlwdGlvbjwvYj4nKSwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSAnIzAwQURCNScpLA0KICAgIGFsaWduID0gYygnbGVmdCcsJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3doaXRlJywgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSA0MA0KICApLA0KICBjZWxscyA9IGxpc3QoDQogICAgdmFsdWVzID0gYmhla19zaGFyZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpiaGVrX2ZpZyANCmBgYA0KVGhlIG1vc3Qgc2hhcmVkIHR3ZWV0IGJ5IEJoZWtpc2lzYSBpcyBhIHR3ZWV0IGNvbmNlcm5pbmcgYWJvcnRpb24gYWN0aXZpc20sIGFuZCBhcyBzdWNoIGNhbiBiZSBkZWVtZWQgaW5zaWduaWZpY2FudC4gDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3AgbWVudGlvbnMgcGxvdA0KZ2dwbG90KGJoZWtpc2lzYV9tZW50aW9ucywgYWVzKHggPSByZW9yZGVyKG1lbnRpb25zLCBuKSwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgTWVudGlvbnMgaW4gQmhla2lzaXNhIFR3ZWV0cyIpDQpgYGANClRoZSB0b3AgbWVudGlvbiBvZiBAQmhla2lzaXNhX01HIGlzIHRoYXQgb2YgYSBCaGVraXNpc2EgcmVwb3J0ZXIgbmFtZWQgSm9hbiB2YW4gRHlrIChAdmFuZHlram9hbiksIHNlY29uZCBiZWluZyDigJhAbWlhbWFsYW7igJkuIFRoZSAzcmQgYW5kIDR0aCByZWZlcnJpbmcgdG8gUHJvZmVzc29yIEFiZG9vbCBLYXJpbSwgd2hvIGNhbiBiZSB2aWV3ZWQgYXMgdGhlIGZhY2Ugb2YgQ292aWQgcmVsYXRlZCBzY2llbmNlIGluIFNvdXRoIEFmcmljYS4gDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI1RvcCB3b3JkcyBwbG90DQpnZ3Bsb3QoYmhla2lzaXNhX3dvcmRzLCBhZXMoeCA9IHJlb3JkZXIod29yZCwgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIFdvcmRzIGluIEJoZWtpc2lzYSBUd2VldHMiKQ0KDQpgYGANClRvcCB3b3JkcyBncmFwaDoNCuKAmHZhY2NpbmXigJkgd2FzIHRoZSBmb3VydGggbW9zdCBwcm9taW5lbnQgd29yZCBmb2xsb3dlZCBieSDigJhqYWLigJkgYXQgNXRoIHBsYWNlLiBUaGUgZmlyc3QgbW9zdCBmcmVxdWVudGx5IHVzZWQgd29yZCB3aXRoaW4gdGhlIEJoZWtpc2lzYSB0d2VldHMgd2FzIOKAmGFyY2hpdmXigJksIGFzIHRoZSBCaGVraXNpc2EgVHdpdHRlciBhY2NvdW50IHVzZXMgdGhlIHdvcmQgdG8gcmVmZXIgdG8gdGhlaXIgb3duIHJlc291cmNlIHBvb2wgd2l0aCB3aGljaCB0aGVpciBmb2xsb3dlcnMgY2FuIGludGVyYWN0IHdpdGguIFRoZSBzZWNvbmQgYW5kIHRoaXJkIHdvcmRzLCDigJhwZW9wbGXigJkgYW5kIOKAmHNvdXRo4oCZIGFyZSBkZWVtZWQgaW5zaWduaWZpY2FudC4NCg0KDQojIyBOYXRpb25hbCBJbnN0aXR1dGUgb2YgQ29tbXVuaWNhYmxlIERpc2Vhc2VzIChAbmljZF9zYSkNCg0KDQpUaGUgTmF0aW9uYWwgSW5zdGl0dXRlIGZvciBDb21tdW5pY2FibGUgRGlzZWFzZXMgKE5JQ0QpIGlzIGEgU291dGggQWZyaWNhbiBOYXRpb25hbCBwdWJsaWMgaGVhbHRoIGluc3RpdHV0ZS4gSXRz4oCZIGFjdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlIFNvdXRoIEFmcmljYW4gZ292ZXJubWVudCwgcmVmbGVjdGluZyBtZWFucyBvZiByZXNwb25zZSwgbW9uaXRvcmluZywgdHJhaW5pbmcsIGRpYWdub3N0aWNzLCBhbmQgcmVzZWFyY2ggb2YgY29tbXVuaWNhYmxlIGRpc2Vhc2VzLiBPbmUgb2YgaXRzIG1haW4gcHVycG9zZXMgYmVpbmcgb3V0YnJlYWsgcmVzcG9uc2UgYW5kIHN1cnZlaWxsYW5jZS4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0KDQojTklDRCBUaW1lbGluZSBGcmVxdWVuY3kNCnRzX3Bsb3QobmljZF90d2VldHMsIGNvbG9yID0gIiMwMEFEQjUiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJGcmVxdWVuY3kgb2YgTklDRCBUd2VldHMiLCANCiAgICAgICBjYXB0aW9uID0gIlVwZGF0ZWQ6IEp1bHkgMjAyMSIpICsNCiAgeWxhYigiRnJlcXVlbmN5IikgKw0KICB4bGFiKE5VTEwpDQoNCmBgYA0KVGltZSBzZXJpZXMgc2hvd2luZyB0aGUgZnJlcXVlbmN5IG9mIE5JQ0QgdHdlZXRzIG92ZXIgdGltZSBpbmRpY2F0ZXMgdGhhdCBvbiBhdmVyYWdlIG1vcmUgdGhhbiA5MCB0d2VldHMgYXJlIG1hZGUgcGVyIHdlZWsgZXhjZXB0IGZvciBKdW5lIDI3IHdoZXJlIGxlc3MgdGhhbiA5MCB0d2VldHMgd2VyZSBtYWRlLg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IGxpa2VkIFR3ZWV0cyBQbG90DQpuaWNkX2ZpZzEgPC0gcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjUwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBMaWtlZCBUd2VldHM8L2I+PGJyPmFzIG9mIEp1bHkgMjAyMScsICc8Yj5Ud2VldCBEZXNjcmlwdGlvbjwvYj4nKSwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSAnIzAwQURCNScpLA0KICAgIGFsaWduID0gYygnbGVmdCcsJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3doaXRlJywgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSA0MA0KICApLA0KICBjZWxscyA9IGxpc3QoDQogICAgdmFsdWVzID0gbmljZF9saWtlX3ZhbCwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSBjKCcjZjhmNGZmJywgJ3doaXRlJykpLA0KICAgIGFsaWduID0gYygnbGVmdCcsICdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9IGMoJyM1MDY3ODQnKSwgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSAzMA0KICAgICkpDQoNCm5pY2RfZmlnMQ0KYGBgDQpOSUNE4oCZcyBtb3N0IGxpa2VkIHR3ZWV0IGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgaW5pdGlhbCBvdXRicmVhayBvZiB0aGUgU0FSUy1Db1YtMiB2aXJ1cywgYWxzbyByZWZlcnJlZCB0byBhcyBjb3ZpZC0xOS4gVGhlIDJuZCBtb3N0IGxpa2VkIHR3ZWV0IGZyb20gdGhlIE5JQ0QgYWNjb3VudCBpcyBhIHR3ZWV0IHByYWlzaW5nIFNB4oCZcyBmcm9udGxpbmUgaGVhbHRoIHdvcmtlcnMgaW4gdGhlIHN0cnVnZ2xlIGFnYWluc3QgdGhlIENvdmlkLTE5IG91dGJyZWFrLiBUaGUgdGhpcmQgbW9zdCBsaWtlZCB0d2VldCBpcyBhIHR3ZWV0IHNpZ25hbGxpbmcgdGhlIGVhcmx5IGluY3JlYXNlIG9mIGNvbmZpcm1lZCBjYXNlcyB3aXRoaW4gU291dGggQWZyaWNhLiBUaGUgZm91cnRoIG1vc3QgbGlrZWQgdHdlZXQgaW5kaWNhdGVzIHRoZSBjb25maXJtZWQgY2FzZXMgd2l0aGluIFNvdXRoIEFmcmljYSByZWFjaGluZyAxNTA1LiBUaGUgNXRoIG1vc3QgbGlrZWQgdHdlZXQgaXMgYW5vdGhlciBpbmZvcm1hdGl2ZSB0d2VldCBvbiB0aGUgZ3Jvd2luZyBudW1iZXIgb2YgY29uZmlybWVkIGNhc2VzIGluIFNvdXRoIEFmcmljYS4gDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI0hhc2h0YWcgcGxvdA0KZ2dwbG90KG5pY2RfZGZfaGFzaHRhZ3MsIGFlcyh4ID0gcmVvcmRlcihoYXNodGFnLCBuKSwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgSGFzaHRhZ3MgaW4gTklDRCBUd2VldHMiKQ0KYGBgDQpUb3AgaGFzaHRhZ3MgYXJlIHN0cnVjdHVyZWQgYXMgZm9sbG93czogMS4g4oCYI0NPVklEMTnigJksIDIuIOKAmCNGaWdodENPVklEMTnigJksIDMuIOKAmCNTdGF5U2FmZeKAmSwgNC4g4oCYI0NPVklEMTlTdXJ2ZWlsbGFuY2XigJksIDUuIOKAmCNGbGF0dGVuVGhlQ3VydmXigJkgNi4g4oCYI1N0YXlBdEhvbWXigJksIDcuIOKAmCNTcHJlYWRUaGVGYWN0c+KAmSwgOC4g4oCYI2Nvcm9uYXZpcnVz4oCZIDkuIOKAmCNUaXNUaGVTZWFzb25Ub0JlU2FmZeKAmSwgMTAuIOKAmCNTdGF5QXRob21l4oCZLg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IHNoYXJlZCBwbG90DQpuaWNkX2ZpZyA8LSBwbG90X2x5KA0KICB0eXBlID0gJ3RhYmxlJywNCiAgY29sdW1ub3JkZXIgPSBjKDEsMiksDQogIGNvbHVtbndpZHRoID0gYygyODAsNDAwKSwNCiAgaGVhZGVyID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBjKCc8Yj5Nb3N0IEZyZXF1ZW50bHkgU2hhcmVkIFR3ZWV0PC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IG5pY2Rfc2hhcmVfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0KbmljZF9maWcNCmBgYA0KVGhlIG1vc3QgZnJlcXVlbnRseSBzaGFyZWQgdHdlZXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJpc2luZyBjb25maXJtZWQgY2FzZXMgb2YgQ09WSUQtMTksIGF0IDQwMiBjb25maXJtZWQgY2FzZXMuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3AgbWVudGlvbnMgcGxvdA0KZ2dwbG90KG5pY2RfbWVudGlvbnMsIGFlcyh4ID0gcmVvcmRlcihtZW50aW9ucywgbiksIHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgTWVudGlvbnMgaW4gTklDRCBUd2VldHMiKQ0KYGBgDQpUaGUgTklDRCBpcyBhIG1ham9yIHByb3ZpZGVyIG9mIG5hdGlvbmFsIGhlYWx0aCBpbmZvcm1hdGlvbiB3aXRoIOKAmEBIZWFsdGhaQeKAmSAoU0EgRGVwYXJ0bWVudCBvZiBIZWFsdGgpIGJlaW5nIHRoZSBtb3N0IGZyZXF1ZW50IG1lbnRpb24gd2l0aGluIHRoZWlyIHR3ZWV0cy4gRm9sbG93ZWQgYnkg4oCYIEBuaWNkc2HigJkgYW5kIOKAmEBEclp3ZWxpTWtoaXpl4oCZLCB0aGUgTmF0aW9uYWwgTWluaXN0ZXIgb2YgSGVhbHRoLCBhdCB0aGUgdGltZS4gVGhlIOKAmEBXSE/igJkgYW5kIOKAmEBTQUhQUkEx4oCZLCB0d28gc2lnbmlmaWNhbnQgQ292aWQtMTkgcmVsYXRlZCBpbnN0aXR1dGVzLCBvbmUgYmVpbmcgbmF0aW9uYWwgYW5kIHRoZSBvdGhlciBpbnRlcm5hdGlvbmFsLiANCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojVG9wIHdvcmRzIHBsb3QNCmdncGxvdChuaWNkX3dvcmRzLCBhZXMoeCA9IHJlb3JkZXIod29yZCwgbiksIHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgV29yZHMgaW4gTklDRCBUd2VldHMiKQ0KDQpgYGANClRoZSBtb3N0IGZyZXF1ZW50IHdvcmQgd2l0aGluIE5JQ0QgdHdlZXRzIGlzIOKAmHRvdGFs4oCZLCBmb2xsb3dlZCBieSDigJhkZWF0aOKAmSBhbmQg4oCYdXBkYXRl4oCZLiBUaGlzIGNvdWxkIGJlIGFuIGluZGljYXRpb24gb2YgQ09WSUQgc3RhdGlzdGljcyBiZWluZyByZWxlYXNlZCBieSB0aGUgTklDRCBwbGF0Zm9ybS4gVGhlIGZvdXJ0aCBhbmQgZmlmdGggd29yZHMgYXJlIOKAmHNhZmXigJkgYW5kIOKAmHRlc3Rz4oCZLiANCg0KIyMgU291dGggQWZyaWNhbiBEZXBhcnRtZW50IG9mIEhlYWx0aCAoQEhlYWx0aFpBKQ0KDQoNClRoZSBTb3V0aCBBZnJpY2FuIERlcGFydG1lbnQgb2YgSGVhbHRoIGlzIGFuIG9yZ2FuaXphdGlvbmFsIHNlY3RvciB3aXRoaW4gdGhlIFNvdXRoIEFmcmljYW4gZ292ZXJubWVudCBjb25jZXJuZWQgd2l0aCBhbGwgYXNwZWN0cyBvZiBuYXRpb25hbCBoZWFsdGguIFRoZSBleGVjdXRpdmUgZGVwYXJ0bWVudCBjb25zaXN0cyBvZiBzZXZlcmFsIGNvbW1pdHRlZXMgYW5kIGNvdW5jaWxzIGFsbCB3aXRoIHRoZSBtYWluIGdvYWwgb2YgaW5jcmVhc2luZyB0aGUgaGVhbHRoIHN0YXR1cyBvZiB0aGUgU291dGggQWZyaWNhbiBjaXRpemVuLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCg0KI0hlYWx0aFpBIFRpbWVsaW5lIEZyZXF1ZW5jeQ0KdHNfcGxvdChoZWFsdGh6YV90d2VldHMsIGNvbG9yID0gIiMwMEFEQjUiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJGcmVxdWVuY3kgb2YgSGVhbHRoWkEgVHdlZXRzIiwNCiAgICAgICBjYXB0aW9uID0gIlVwZGF0ZWQ6IEp1bHkgMjAyMSIpICsNCiAgeWxhYigiRnJlcXVlbmN5IikgKw0KICB4bGFiKE5VTEwpDQpgYGANClRoZSBmcmVxdWVuY3kgb2YgSGVhbHRoWkEgdHdlZXRzIGRvIG5vdCBzaG93Y2FzZSBhbnkgbm90ZXdvcnRoeSBpbmZvcm1hdGlvbi4gDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IGxpa2VkIFR3ZWV0cyBQbG90DQpoZWFsdGh6YV9maWcxIDwtDQogIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI1MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgTGlrZWQgVHdlZXRzPC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGhlYWx0aHphX2xpa2VfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0KaGVhbHRoemFfZmlnMQ0KYGBgDQoxc3QgTW9zdCBsaWtlZCBUd2VldCBpcyB0aGF0IG9mIGEgbWVzc2FnZSBmcm9tIFNB4oCZcyBEZXBhcnRtZW50IG9mIEhlYWx0aCBhbm5vdW5jaW5nIHRoYXQgdGhlcmUgYXJlIHJlY292ZXJpZXMgYW1vbmcgcmVwb3J0ZWQgQ292aWQtMTkgY2FzZXMuIFRoZSAybmQgcmVmZXJyaW5nIHRvIGludGVybmF0aW9uYWwgaGVscCBpbiBTQeKAmXMgQ09WSUQtMTkgY2F1c2UsIGVzcGVjaWFsbHkgdGhhdCBvZiBDdWJhbiBtZWRpY2FsIHN0YWZmLiBUaGUgM3JkIHR3ZWV0IGluZm9ybWluZyB0aGUgcHVibGljIG9uIGRldGFpbHMgYWJvdXQgdGhlIHNlY29uZCByZXBvcnRlZCBjb3ZpZC1yZWxhdGVkIGRlYXRoIGluIFNBLiBUaGUgNHRoIGdpdmluZyBhbiB1cGRhdGUgb24gY29uZmlybWVkIGFuZCByZWNvdmVyZWQgY2FzZXMsIGZvbGxvd2VkIGJ5IHRoZSA1dGggd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIHNwcmVhZCBvZiBDb3ZpZCB0aHJvdWdoIHNvY2lhbCBpbnRlcmFjdGlvbnMuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI0hhc2h0YWcgcGxvdA0KZ2dwbG90KGhlYWx0aHphX2RmX2hhc2h0YWdzLCBhZXMoeCA9IHJlb3JkZXIoaGFzaHRhZywgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIEhhc2h0YWdzIGluIERlcGFydG1lbnQgb2YgSGVhbHRoIFR3ZWV0cyIpDQpgYGANClRvcCBoYXNodGFncyBhcmUgc3RydWN0dXJlZCBhcyBmb2xsb3dzOiAxLiDigJgjQ09WSUQxOeKAmSwgMi4g4oCYI0Nvcm9uYVZpcnVzU0HigJksIDMuIOKAmCNDb3JvbmFWaXJ1c1VwZGF0ZeKAmSwgNC4g4oCYI0NvdmlkMTnigJksIDUuIOKAmCNDb3JvbmF2aXJ1c1NB4oCZIDYuIOKAmCNWYWNjaW5lUm9sbG91dFNB4oCZLCA3LiDigJgjQ29yb25hVmlydXPigJksIDguIOKAmCNTdGF5U2FmZeKAmSA5LiDigJgjY29yb25hdmlydXPigJksIDEwLiDigJgjQ2VsZWJyYXRlU2FmZeKAmS4NCg0KYGBge3IgIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI01vc3Qgc2hhcmVkIHR3ZWV0IHBsb3QNCmhlYWx0aHphX2ZpZyA8LSANCiAgcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjgwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBGcmVxdWVudGx5IFNoYXJlZCBUd2VldDwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBoZWFsdGh6YV9zaGFyZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpoZWFsdGh6YV9maWcNCmBgYA0KVGhlIERlcGFydG1lbnQgb2YgSGVhbHRo4oCZcyBtb3N0IHNoYXJlZCB0d2VldCBpcyBhbiBhbm5vdW5jZW1lbnQgdGVsbGluZyBjaXRpemVucyB3aG8gd2VyZSBwYXJ0IG9mIGNlcnRhaW4gY3J1aXNlIHRyaXBzIHRvIGNvbnRhY3QgdGhlIGRlcGFydG1lbnQgYXMgc29vbiBhcyBwb3NzaWJsZS4gDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI1RvcCBtZW50aW9ucw0KZ2dwbG90KGhlYWx0aHphX21lbnRpb25zLCBhZXMoeCA9IHJlb3JkZXIobWVudGlvbnMsIG4pLCB5ID0gbikpICsNCiAgICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIE1lbnRpb25zIGluIERlcGFydG1lbnQgb2YgSGVhbHRoIFR3ZWV0cyIpDQpgYGANCuKAmEBHYXV0ZW5nSGVhbHRo4oCZIGlzIGFtb25nIHRoZSB0b3AgZml2ZSBtZW50aW9ucyBvZiBIZWFsdGhaQSB0d2VldHMsIHRoaXMgaXMgcmVmZXJyaW5nIHRvIHRoZSBjdXJyZW50IHNldmVyaXR5IG9mIHRoZSBsb2NrZG93biB3aXRoaW4gdGhlIHByb3ZpbmNlLiBBbW9uZyB0aG9zZSBpbiB0aGUgdG9wIDEwIG1lbnRpb25zIGFyZSwg4oCYQEN5cmlsUmFtYXBob3Nh4oCZLCDigJhATVJDemHigJksIOKAmEBVTklDRUZTQeKAmSwgQG5pY2RzYeKAmSwg4oCYQFdIT1NvdXRoQWZyaWNh4oCZIGFuZCDigJhAV2VzdENhcGVIZWFsdGjigJkuIEFsbCB0aGVzZSBtZW50aW9ucyBjYW4gYmUgcmVsYXRlZCB0byB0aGUgQ292aWQtMTkgcGFuZGVtaWMuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3Agd29yZHMgUGxvdA0KZ2dwbG90KGhlYWx0aHphX3dvcmRzLCBhZXMoeCA9IHJlb3JkZXIod29yZCwgbiksIHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgV29yZHMgaW4gRGVwYXJ0bWVudCBvZiBIZWFsdGggVHdlZXRzIikNCiAgDQpgYGANClRoZSBtb3N0IGZyZXF1ZW50IHdvcmQgaXMg4oCYc291dGjigJkgZm9sbG93ZWQgYnkg4oCYYWZyaWNh4oCZLiBUaGUgbG9naWNhbCByZWFzb25pbmcgZm9yIHRoaXMgd291bGQgYmUgdGhhdCBtb3N0IHR3ZWV0cyB3b3VsZCBjb250YWluIHRoZXNlIHR3byB0ZXJtcyBhcyB0aGUgYWNjb3VudCBob2xkZXIgaXMgdGhlIE5hdGlvbmFsIERlcGFydG1lbnQgb2YgSGVhbHRoLiBUaGUgM3JkIHRlcm0gaXMg4oCYdG90YWzigJkgZm9sbG93ZWQgYnkg4oCYZGVhdGhz4oCZLCBhcyBjb3ZpZCBzdGF0aXN0aWNzIGFyZSByZWxlYXNlZCB0aHJvdWdoIHRoaXMgY2hhbm5lbC4gVGhlIDV0aCBtb3N0IGZyZXF1ZW50IHdvcmQgaXMg4oCYY292aWQxOeKAmSBhbmQgdGhlIDh0aCBpcyDigJh0ZXN0c+KAmS4gDQoNCiMjIEV5ZSBXaXRuZXNzIE5ld3MgKEBld25yZXBvcnRlcikNCg0KDQpFeWUgV2l0bmVzcyBOZXdzIGlzIGEgU291dGggQWZyaWNhbiBuZXdzIGFnZW5jeSBjb3ZlcmluZyBtZWRpYSBvbiBhIGJyb2FkIGJhc2Ugb2YgYXBwbGljYWJsZSBpbmR1c3RyaWVzIGFuZCBzZWN0b3JzLg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0KDQojRVdOIFRpbWVsaW5lIEZyZXF1ZW5jeQ0KdHNfcGxvdChld25yZXBvcnRlcl90d2VldHMsIGNvbG9yID0gIiMwMEFEQjUiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJGcmVxdWVuY3kgb2YgRVdOIFR3ZWV0cyIsDQogICAgICAgY2FwdGlvbiA9ICJVcGRhdGVkOiBKdWx5IDIwMjEiKSArDQogIHlsYWIoIkZyZXF1ZW5jeSIpICsNCiAgeGxhYihOVUxMKQ0KYGBgDQpUaW1lIHNlcmllcyBvZiB0aGUgZnJlcXVlbmN5IG9mIHR3ZWV0cyBieSBFV04gaW5kaWNhdGVzIHRoYXQgb24gYXZlcmFnZSB0aGUgYWNjb3VudCB0d2VldHMgaW4gYSB2b2xhdGlsZSBtYW5uZXIuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IGxpa2VkIFR3ZWV0cyBQbG90DQpld25yZXBvcnRlcl9maWcxIDwtIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI1MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgTGlrZWQgVHdlZXRzPC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGV3bl9saWtlX3ZhbCwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSBjKCcjZjhmNGZmJywgJ3doaXRlJykpLA0KICAgIGFsaWduID0gYygnbGVmdCcsICdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9IGMoJyM1MDY3ODQnKSwgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSAzMA0KICAgICkpDQoNCmV3bnJlcG9ydGVyX2ZpZzENCmBgYA0KTm9uZSBvZiB0aGUgbW9zdCBsaWtlZCB0d2VldHMgb2YgdGhlIEVXTiBUd2l0dGVyIGFjY291bnQgYXJlIHJlbGF0ZWQgdG8gQ09WSUQgYW5kIGFzIHN1Y2ggaXMgZGVlbWVkIGlycmVsZXZhbnQuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNIYXNodGFnIHBsb3QNCmdncGxvdChld25yZXBvcnRlcl9kZl9oYXNodGFncywgYWVzKHggPSByZW9yZGVyKGhhc2h0YWcsIG4pLCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikrDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfaGMoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSANCiAgZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxLCBzaXplPTgpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZT0xNSkpKw0KICB5bGFiKCJGcmVxdWVuY3kiKSsNCiAgeGxhYigiIikrDQogIGdndGl0bGUoIlRvcCBIYXNodGFncyBpbiBFV04gVHdlZXRzIikNCmBgYA0KVG9wIGhhc2h0YWdzIGFyZSBzdHJ1Y3R1cmVkIGFzIGZvbGxvd3M6IDEuIOKAmCNDT1ZJRDE54oCZLCAyLiDigJgjRmlnaHRDT1ZJRDE54oCZLCAzLiDigJgjU3RheVNhZmXigJksIDQuIOKAmCNDT1ZJRDE5U3VydmVpbGxhbmNl4oCZLCA1LiDigJgjRmxhdHRlblRoZUN1cnZl4oCZIDYuIOKAmCNTdGF5QXRIb21l4oCZLCA3LiDigJgjU3ByZWFkVGhlRmFjdHPigJksIDguIOKAmCNjb3JvbmF2aXJ1c+KAmSA5LiDigJgjU3RheUF0aG9tZeKAmSwgMTAuIOKAmCNUaXNUaGVTZWFzb25Ub0JlU2FmZeKAmS4NCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojTW9zdCBmcmVxdWVudGx5IHNoYXJlZA0KZXducmVwb3J0ZXJfZmlnIDwtIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI4MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgRnJlcXVlbnRseSBTaGFyZWQgVHdlZXQ8L2I+PGJyPmFzIG9mIEp1bHkgMjAyMScsICc8Yj5Ud2VldCBEZXNjcmlwdGlvbjwvYj4nKSwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSAnIzAwQURCNScpLA0KICAgIGFsaWduID0gYygnbGVmdCcsJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3doaXRlJywgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSA0MA0KICApLA0KICBjZWxscyA9IGxpc3QoDQogICAgdmFsdWVzID0gZXduX3NoYXJlX3ZhbCwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSBjKCcjZjhmNGZmJywgJ3doaXRlJykpLA0KICAgIGFsaWduID0gYygnbGVmdCcsICdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9IGMoJyM1MDY3ODQnKSwgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSAzMA0KICAgICkpDQoNCmV3bnJlcG9ydGVyX2ZpZw0KYGBgDQpUaGUgbW9zdCBmcmVxdWVudGx5IHNoYXJlZCB0d2VldCBvZiBOZXdzMjQgaXMgdW5yZWxhdGVkIHRvIGNvdmlkLTE5Lg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3AgbWVudGlvbnMNCmdncGxvdChld25yZXBvcnRlcl9tZW50aW9ucywgYWVzKHggPSByZW9yZGVyKG1lbnRpb25zLCBuKSwgeSA9IG4pKSArDQogICAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikrDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfaGMoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSANCiAgZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxLCBzaXplPTgpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZT0xNSkpKw0KICB5bGFiKCJGcmVxdWVuY3kiKSsNCiAgeGxhYigiIikrDQogIGdndGl0bGUoIlRvcCBNZW50aW9ucyBpbiBFV04gVHdlZXRzIikNCmBgYA0KVGhlIHRvcCBtZW50aW9ucyBpbiBFV04gdHdlZXRzIGFyZSB1bnJlbGF0ZWQgdG8gQ292aWQtMTkuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI1RvcCB3b3Jkcw0KZ2dwbG90KGV3bnJlcG9ydGVyX3dvcmRzLCBhZXMoeCA9IHJlb3JkZXIod29yZCwgbiksIHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgV29yZHMgaW4gRVdOIFR3ZWV0cyIpDQoNCmBgYA0KTW9zdCBmcmVxdWVudGx5IHdvcmRzIGluIEVXTiBuZXdzIHR3ZWV0cyBhcmUg4oCYcG9saWNl4oCZLCDigJhwZW9wbGXigJksIOKAmGNhcGXigJksIGZvbGxvd2VkIHdpdGgg4oCYY292aWQxOeKAmSBpbiB0aGUgNHRoIHBvc2l0aW9uIGFuZCDigJhoZWFsdGjigJkgaW4gNXRoLiANCg0KIyMgTkVXUzI0IChATmV3czI0KQ0KDQoNCk5ld3MyNCBpcyBvbiBvZiBTb3V0aCBBZnJpY2HigJlzIG1vc3QgcHJvbWluZW50IG9ubGluZSBuZXdzIHBsYXRmb3JtcyBhbmQgd2FzIGxhdW5jaGVkIGluIDIwMDcuIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCg0KI05ld3MyNCBUaW1lbGluZSBGcmVxdWVuY3kNCnRzX3Bsb3QobmV3czI0X3R3ZWV0cywgY29sb3IgPSAiIzAwQURCNSIsIHNpemUgPSAxKSArDQogIHRoZW1lX2hjKCkgKw0KICBsYWJzKHRpdGxlID0gIkZyZXF1ZW5jeSBvZiBOZXdzMjQgVHdlZXRzIikgKw0KICB5bGFiKCJGcmVxdWVuY3kiKSArDQogIHhsYWIoTlVMTCkNCmBgYA0KVGhlcmUgYXJlIG5vIHNpZ25pZmljYW50IHBlYWtzIG9yIGxvdyBwb2ludHMgTmV3czI0IHR3ZWV0cy4gDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI01vc3QgbGlrZWQgVHdlZXRzIFBsb3QNCm5ld3MyNF9maWcxIDwtIA0KICBwbG90X2x5KA0KICB0eXBlID0gJ3RhYmxlJywNCiAgY29sdW1ub3JkZXIgPSBjKDEsMiksDQogIGNvbHVtbndpZHRoID0gYygyNTAsNDAwKSwNCiAgaGVhZGVyID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBjKCc8Yj5Nb3N0IExpa2VkIFR3ZWV0czwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBuZXdzMjRfbGlrZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpuZXdzMjRfZmlnMQ0KYGBgDQpUaGUgbW9zdCBsaWtlZCB0d2VldCBpcyB1bnJlbGF0ZWQgdG8gQ09WSUQtMTksIGluY2x1ZGluZyB0aGUgMm5kLCAzcmQsNHRoIGFuZCA1dGguIA0KDQpgYGB7ciAgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojSGFzaHRhZyBwbG90DQpnZ3Bsb3QobmV3czI0X2RmX2hhc2h0YWdzLCBhZXMoeCA9IHJlb3JkZXIoaGFzaHRhZywgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIEhhc2h0YWdzIGluIE5ld3MyNCBUd2VldHMiKQ0KYGBgDQpUb3AgaGFzaHRhZ3MgYXJlIHN0cnVjdHVyZWQgYXMgZm9sbG93czogMS4g4oCYI0NPVklEMTnigJksIDIuIOKAmCNGaWdodENPVklEMTnigJksIDMuIOKAmCNTdGF5U2FmZeKAmSwgNC4g4oCYI0NPVklEMTlTdXJ2ZWlsbGFuY2XigJksIDUuIOKAmCNGbGF0dGVuVGhlQ3VydmXigJkgNi4g4oCYI1N0YXlBdEhvbWXigJksIDcuIOKAmCNTcHJlYWRUaGVGYWN0c+KAmSwgOC4g4oCYI2Nvcm9uYXZpcnVz4oCZIDkuIOKAmCNTdGF5QXRob21l4oCZLCAxMC4g4oCYI1Rpc1RoZVNlYXNvblRvQmVTYWZl4oCZLg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IHNoYXJlZCB0d2VldHMgcGxvdA0KbmV3czI0X2ZpZyA8LQ0KICBwbG90X2x5KA0KICB0eXBlID0gJ3RhYmxlJywNCiAgY29sdW1ub3JkZXIgPSBjKDEsMiksDQogIGNvbHVtbndpZHRoID0gYygyNTAsNDAwKSwNCiAgaGVhZGVyID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBjKCc8Yj5Nb3N0IEZyZXF1ZW50bHkgU2hhcmVkIFR3ZWV0PC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IG5ld3MyNF9zaGFyZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpuZXdzMjRfZmlnDQpgYGANClRoZSBtb3N0IGZyZXF1ZW50bHkgc2hhcmVkIHR3ZWV0IG9mIE5ld3MyNCBpcyB1bnJlbGF0ZWQgdG8gY292aWQtMTkuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI1RvcCBtZW50aW9ucyANCmdncGxvdChuZXdzMjRfbWVudGlvbnMsIGFlcyh4ID0gcmVvcmRlcihtZW50aW9ucywgbiksIHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgTWVudGlvbnMgaW4gTmV3czI0IFR3ZWV0cyIpDQpgYGANClRvcCBtZW50aW9uIGJlaW5nIOKAmEBIZWFsdGhaQeKAmSwgdGhlIFNvdXRoIEFmcmljYW4gRGVwYXJ0bWVudCBvZiBIZWFsdGgsIGZvbGxvd2VkIGJ5IOKAmEBuaWNkc2HigJkgYW5kIOKAmEBEclp3ZWxpTWtoaXpl4oCZLCB0aGUgU291dGggQWZyaWNhbiBNaW5pc3RlciBvZiBIZWFsdGguIFRoZSBXb3JsZCBIZWFsdGggT3JnYW5pc2F0aW9uIChAV0hPKSBhbmQgU0FIUFJBIChAU0FIUFJBMSksIHdoaWNoIGlzIGEgYnJhbmNoIG9mIHRoZSBTb3V0aCBBZnJpY2FuIERlcGFydG1lbnQgb2YgSGVhbHRoIHRhc2tlZCB3aXRoIHRoZSByZWd1bGF0aW9uIG9mIGFsbCBoZWFsdGggLXJlbGF0ZWQgcHJvZHVjdHMgYW5kIGNsaW5pY2FsIHRyaWFscyBpbiBTQSwgYXJlIHdpdGhpbiB0aGUgdG9wIDEwIG9mIHRoZXNlIG1lbnRpb25zLg0KDQpgYGB7ciAgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojVG9wIHdvcmRzDQpnZ3Bsb3QobmV3czI0X3dvcmRzLCBhZXMoeCA9IHJlb3JkZXIod29yZCwgbiksIHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpICsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIFdvcmRzIGluIE5ld3MyNCBUd2VldHMiKQ0KDQpgYGANCk1vc3QgZnJlcXVlbmx5IHVzZWQgd29yZCB3aXRoaW4gTmV3czI0IHR3ZWV0cyBpcyDigJhjb3ZpZDE54oCZLCBmb2xsb3dlZCBieSBtb3JlIGlycmVsZXZhbnQgd29yZHMgc3VjaCBhcyDigJhzb3V0aOKAmSwg4oCYY2FwZeKAmSBhbmQg4oCYY291cnTigJkuDQoNCiMjIFNBQkMgTmV3cyAoQFNBQkNOZXdzKQ0KDQpUaGUgU0FCQyBOZXdzIGFjY291bnQgd2FzIGNob3NlbiBiZWNhdXNlIGl0IGlzIHRoZSBvZmZpY2lhbCBUd2l0dGVyLWJhc2VkIGRpZ2l0YWwgcGxhdGZvcm0gdXNlZCBieSB0aGUgU291dGggQWZyaWNhbiBCcm9hZGNhc3RpbmcgQ29ycG9yYXRpb24sIHdoaWNoIGlzIG9uZSBvZiB0aGUgbW9zdCBwb3B1bGFyIGFuZCByZXB1dGFibGUgbmV3cyBtZWRpYSBzb3VyY2VzIGluIFNvdXRoIEFmcmljYS4gDQoNCmBgYHtyIFNBQkNfTmV3cywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQoNCiNTQUJDIFRpbWVsaW5lIEZyZXF1ZW5jeQ0KdHNfcGxvdChzYWJjX25ld3NfdGltZWxpbmVfZGYsIGNvbG9yID0gIiMwMEFEQjUiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJGcmVxdWVuY3kgb2YgU0FCQyBOZXdzIFR3ZWV0cyIsDQogICAgICAgY2FwdGlvbj0gIlVwZGF0ZWQ6IEp1bHkgMjAyMSIpICsNCiAgeWxhYigiRnJlcXVlbmN5IikgKw0KICB4bGFiKE5VTEwpDQpgYGANClRoZSBTQUJDIE5ld3MgdGltZS1zZXJpZXMgZ3JhcGggc2hvd3MgdGhhdCB0aGUgU0FCQyB0d2l0dGVyIGFjY291bnQgdHdlZXRzIG9uIGF2ZXJhZ2UgbW9yZSB0aGFuIDQwIHR3ZWV0cyBhIGRheSBmb3IgdGhlIHBhc3QgbW9udGgsIGV4Y2VwdCBmb3IgdGhlIDE0dGggSnVuZSBhbmQgNHRoIEp1bHkgMjAyMSB3aGVyZSB0aGUgYXZlcmFnZSB3YXMgbGVzcyB0aGFuIDQwLiANCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojTW9zdCBsaWtlZCBUd2VldHMgUGxvdA0Kc2FiY19maWcxIDwtDQogIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI1MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgTGlrZWQgVHdlZXRzPC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IHNhYmNfbGlrZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpzYWJjX2ZpZzENCmBgYA0KVGhlIHRhYmxlIHNob3dpbmcgdGhlIG1vc3QgbGlrZWQgdHdlZXRzIGluZGljYXRlcyB0aGF0IHRoZSB0b3AgZml2ZSBtb3N0IGxpa2VkIHR3ZWV0cyBjb3ZlciB0aGUgZm9sbG93aW5nIHRvcGljcyAoaW4gZGVzY2VuZGluZyBvcmRlcik6IFRoZSBwb2xpdGljYWwgdW5yZXN0IGluIEVzd2F0aW5pLCB0aGUgY29uc3RpdHV0aW9uYWwgY291cnQgc2VudGVuY2luZyBmb3JtZXIgUHJlc2lkZW50IEphY29iIFp1bWEgdG8gMTUgbW9udGhzIGltcHJpc29ubWVudCBmb3IgY29udGVtcHQgb2YgY291cnQsIHRoZSBOYXRpb25hbCBMaXF1b3IgVHJhZGVycyBDb3VuY2lsIHN0YXRlcyB0aGF0IHNvbWUgbWVtYmVycyB2b3cgdG8gZGVmeSB0aGUgYmFuIG9uIGFsY29ob2wgc2FsZXMsIHRoZSBzYW1lIGFzIHRoZSBzZWNvbmQgdHdlZXQgbWVudGlvbmVkIGFuZCwgbGFzdGx5LCB0aGF0IHRoZSBmb3JtZXIgRXNrb20gYm9hcmQgY2hhaXIsIEphYnUgTWFidXphLCBoYXMgcGFzc2VkIGEgd2F5IGR1ZSB0byBDT1ZJRC0xOS4gRnJvbSB0aGVzZSB0b3AgZml2ZSB0d2VldHMgb25seSB0d28gcGVydGFpbiB0byB0aGUgQ09WSUQtMTkgcGFuZGVtaWMuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUT1AgSEFTSFRBR1MNCmdncGxvdChzYWJjX25ld3NfaGFzaHRhZ3MsIGFlcyh4ID0gcmVvcmRlcihoYXNodGFnLCBuKSwgeSA9IG4pLCBjb2xvciA9IGhhc2h0YWcpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikgKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgSGFzaHRhZ3MgaW4gU0FCQyBOZXdzIFR3ZWV0cyIpDQpgYGANClRoZSBiYXIgY2hhcnQgc2hvd2luZyB0aGUgdG9wIHRlbiBoYXNodGFncyBvZiBTQUJDIE5ld3MgVHdlZXRzIGZvciB0aGUgcGFzdCAzMjAwIHR3ZWV0cywgaW5kaWNhdGVzIHRoYXQgdGhlIGZvbGxvd2luZyBoYXNodGFncyBhcmUgdGhlIG1vc3QgcHJldmFsZW50LiDigJwjU0FCQ05ld3PigJ0sIOKAnCNFVVJPMjAyMOKAnSwg4oCcI0lDWU1J4oCdLCDigJwjQ09WSUQxOeKAnSwg4oCcI0phY29iIFp1bWHigJ0sIOKAnCNTQUJDV2VhdGhlcuKAnSwg4oCcI0V1cm8yMDIw4oCdLCDigJwjU3RhdGVDYXB0dXJlSW5xdWlyeeKAnSwg4oCcI2Nvcm9uYXZpcnVz4oCdLCBhbmQg4oCcI0NPVklEMTlTQeKAnS4gDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI01vc3QgZnJlcXVlbnRseSBzaGFyZWQgdHdlZXRzDQpzYWJjX2ZpZyA8LSBwbG90X2x5KA0KICB0eXBlID0gJ3RhYmxlJywNCiAgY29sdW1ub3JkZXIgPSBjKDEsMiksDQogIGNvbHVtbndpZHRoID0gYygyODAsNDAwKSwNCiAgaGVhZGVyID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBjKCc8Yj5Nb3N0IEZyZXF1ZW50bHkgU2hhcmVkIFR3ZWV0PC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IHNhYmNfc2hhcmVfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0Kc2FiY19maWcNCmBgYA0KDQpUaGUgdGFibGUgc2hvd2luZyB0aGUgbW9zdCBmcmVxdWVudGx5IHNoYXJlZCB0d2VldCBmcm9tIFNBQkMgTmV3cyBpcyBhYm91dCB0aGUgcG9saXRpY2FsIHVucmVzdCBpbiBFc3dhdGluaSBhbmQgZG9lcyBub3QgZGlyZWN0bHkgcGVydGFpbiB0byB0aGUgQ09WSUQtMTkgcGFuZGVtaWMuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3AgbWVudGlvbnMNCmdncGxvdChzYWJjX25ld3NfbWVudGlvbnMsIGFlcyh4ID0gcmVvcmRlcihtZW50aW9ucywgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIE1lbnRpb25zIGluIFNBQkMgTmV3cyBUd2VldHMiKQ0KYGBgDQpUaGUgYmFyIGNoYXJ0IHNob3dpbmcgdGhlIHRvcCBtZW50aW9ucyBpbiBTQUJDIE5ld3MgVHdlZXRzIGluZGljYXRlcyB0aGF0IHRoZSBtb3N0IGZyZXF1ZW50IG1lbnRpb25zIGFyZSDigJxAMTJIMDDigJ0sIOKAnEBZb3VUdWJl4oCdLCDigJxAMTdIMDDigJ0sIOKAnEAxOEgwMOKAnSwg4oCcQFBvZ2JhTm8xZmFu4oCdLCDigJxAVGhlV2F0Y2hkb2dTQUJD4oCdIGFuZCDigJxAdnV5b212b2tv4oCdLiBUaGUgbWVudGlvbnMgZG8gbm90IHByb3ZpZGUgYW55IGluc2lnaHQgYWJvdXQgdGhlIENPVklELTE5IHBhbmRlbWljLiANCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojVG9wIHdvcmRzIHBsb3QNCmdncGxvdChzYWJjX25ld3Nfd29yZHMsIGFlcyh4ID0gcmVvcmRlcih3b3JkLCBuKSwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgV29yZHMgaW4gU0FCQyBuZXdzIFR3ZWV0cyIpDQoNCmBgYA0KVGhlIGJhciBjaGFydCBzaG93aW5nIHRoZSB0b3AgdGVuIHdvcmRzIHVzZWQgaW4gU0FCQyBOZXdzIFR3ZWV0cyBpbmRpY2F0ZSB0aGF0IHRoZSB0b3AgdGVuIHdvcmRzIGFyZSDigJxjb3ZpZDE54oCdLCDigJxzb3V0aOKAnSwg4oCccHJlc2lkZW504oCdLCDigJxBZnJpY2HigJ0sIOKAnGNvdXJ04oCdLCDigJxBZnJpY2Fu4oCdLCDigJxoZWFsdGjigJ0sIOKAnHBlb3BsZeKAnSwg4oCcbWluaXN0ZXLigJ0gYW5kIOKAnHZpZGVv4oCdIGFyZSB0aGVpciB0b3Agd29yZHMuIFRoZSBjaGFydCBpbmRpY2F0ZXMgdGhhdCB0aGUgdG9wIHdvcmQgaXMg4oCcY292aWQxOeKAnSB3aGljaCBhcHBlYXJzIGluIG1vcmUgdGhhbiAyMDAgdHdlZXRzLiANCg0KIyMgZU5DQSAoQGVOQ0EpDQoNClRoZSBlTkNBIGFjY291bnQgd2FzIGNob3NlbiBiZWNhdXNlIGl0IGJlbG9uZ3MgdG8gdGhlIGVOQ0EgMjQtaG91ciBuZXdzIGNoYW5uZWwgdGhhdCBwcmVzZW50cyBuZXdzIGFib3V0IFNvdXRoIEFmcmljYSBhbmQgQWZyaWNhLiBUaGUgYWNjb3VudCBqb2luZWQgaW4gTWF5IDIwMTEuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0KDQojZU5DQSBUaW1lbGluZSBGcmVxdWVuY3kNCnRzX3Bsb3QoZW5jYV90aW1lbGluZV9kZiwgY29sb3IgPSAiIzAwQURCNSIsIHNpemUgPSAxKSArDQogIHRoZW1lX2hjKCkgKw0KICBsYWJzKHRpdGxlID0gIkZyZXF1ZW5jeSBvZiBlTkNBIFR3ZWV0cyIsIA0KICAgICAgIGNhcHRpb24gPSAiVXBkYXRlZDogSnVseSAyMDIxIikgKw0KICB5bGFiKCJGcmVxdWVuY3kiKQ0KYGBgDQoNClRoZSBlTkNBIHRpbWUgc2VyaWVzIGdyYXBoIHNob3dzIHRoYXQgZU5DQSB0d2VldHMgbW9yZSB0aGFuIDUwIHR3ZWV0cyBhIGRheSBvdmVyIHRoZSBwYXN0IG1vbnRoIGV4Y2VwdCBmb3IgdGhlIHdlZWsgYmVmb3JlIHRoZSA3dGggSnVuZSAyMDIxLCB3aGVyZSB0aGVyZSB3ZXJlIGZldyB0byB6ZXJvIHR3ZWV0cy4gDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI01vc3QgZnJlcXVlbnRseSBzaGFyZWQgcGxvdA0KZW5jYV9uZXdzX2ZpZyA8LSANCiAgcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjUwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBGcmVxdWVudGx5IFNoYXJlZCBUd2VldDwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBlbmNhX3NoYXJlX3ZhbCwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSBjKCcjZjhmNGZmJywgJ3doaXRlJykpLA0KICAgIGFsaWduID0gYygnbGVmdCcsICdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9IGMoJyM1MDY3ODQnKSwgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSAzMA0KICAgICkpDQoNCmVuY2FfbmV3c19maWcNCmBgYA0KDQpUaGUgdGFibGUgc2hvd2luZyB0aGUgbW9zdCBmcmVxdWVudGx5IHNoYXJlZCB0d2VldCBhcyBvZiBKdWx5IDIwMjEgaXMgcmVnYXJkaW5nIHRoZSBkZWF0aCBvZiBhIE5pZ2VyaWFuIHRlbGV2YW5nZWxpc3QgVEIgSm9zaHVhLg0KDQpgYGB7ciAgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojVE9QIEhBU0hUQUdTIFBMT1QNCmdncGxvdChlbmNhX25ld3NfaGFzaHRhZ3MsIGFlcyh4ID0gcmVvcmRlcihoYXNodGFnLCBuKSwgeSA9IG4pLCBjb2xvciA9IGhhc2h0YWcpICsNCmdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgSGFzaHRhZ3MgaW4gZU5DQSBUd2VldHMiKQ0KYGBgDQoNClRoZSBiYXIgY2hhcnQgc2hvd2luZyB0aGUgdG9wIGhhc2h0YWdzIGluIGVOQ0EgdHdlZXRzIGluZGljYXRlcyB0aGF0IChpbiBkZXNjZW5kaW5nIG9yZGVyKSDigJwjRFN0djQwM+KAnSwg4oCcI2VOQ0HigJ0sIOKAnCNDT1ZJRDE54oCdLCDigJwjZU5DQXPigJ0sIOKAnCNTb3V0aEFmcmljYW5Nb3JuaW5n4oCdLCDigJwjTmV3c0xpbmvigJ0sIOKAnCNTb3V0aEFmcmljYVRvbmlnaHTigJ0sIOKAnCNQcm9wZXJ0eU1hdHRlcnPigJ0sIOKAnCNBbGxBbmdsZXPigJ0sIOKAnCNUaGVNaWRkYXlWaWV34oCdIGFuZCDigJwjVGhlTGVhZOKAnSBhcmUgdGhlaXIgdG9wIGhhc2h0YWdzLiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgQ09WSUQtMTkgcGFuZGVtaWMgcmFua3MgdGhpcmQgaW4gZU5DQeKAmXMgdG9wIGhhc2h0YWdzLCB3aGlsZSB0aGUgcmVzdCBvZiB0aGUgaGFzaHRhZ3MgcmVmZXIgdG8gZWl0aGVyIGVOQ0EgdGhlbXNlbGYgb3IgdGhlIHJlc3BlY3RpdmUgcHJvZ3JhbW1lcyBvbiB0aGVpciB0ZWxldmlzaW9uIGNoYW5uZWwgIChEU1RWNDAzKS4NCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojTW9zdCBsaWtlZCBUd2VldHMgUGxvdA0KZW5jYV9uZXdzX2ZpZzEgPC0gcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjgwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBMaWtlZCBUd2VldHM8L2I+PGJyPmFzIG9mIEp1bHkgMjAyMScsICc8Yj5Ud2VldCBEZXNjcmlwdGlvbjwvYj4nKSwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSAnIzAwQURCNScpLA0KICAgIGFsaWduID0gYygnbGVmdCcsJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3doaXRlJywgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSA0MA0KICApLA0KICBjZWxscyA9IGxpc3QoDQogICAgdmFsdWVzID0gZW5jYV9saWtlX3ZhbCwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSBjKCcjZjhmNGZmJywgJ3doaXRlJykpLA0KICAgIGFsaWduID0gYygnbGVmdCcsICdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9IGMoJyM1MDY3ODQnKSwgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSAzMA0KICAgICkpDQoNCmVuY2FfbmV3c19maWcxDQpgYGANCg0KVGhlIHRhYmxlIHNob3dpbmcgdGhlIG1vc3QgbGlrZWQgdHdlZXRzIGluZGljYXRlcyB0aGF0IHRoZSB0b3AgZml2ZSBtb3N0IGxpa2VkIHR3ZWV0cyBvZiBlTkNBIGFyZSAoaW4gZGVzY2VuZGluZyBvcmRlcikgYSBuZXdzIHJlcG9ydCBvZiB0aGUgZGVhdGggb2YgVEIgSm9zaHVhLCBuZXdzIHJlcG9ydCBvZiBadW1hIHN1cHBvcnRlcnMgZGVmeWluZyBsb2NrZG93biByZWd1bGF0aW9ucywgbmV3cyByZXBvcnQgb2YgUHJlc2lkZW50IEN5cmlsIFJhbWFwaG9zYeKAmXMgYWRkcmVzcyB0byB0aGUgbmF0aW9uIGFuZCBuaWdodCwgYSBuZXdzIHJlcG9ydCBvZiBmb3JtZXIgUHJlc2lkZW50IFp1bWEgYmVpbmcgc2VudGVuY2VkIHRvIDE1ICBtb250aHMgaW1wcmlzb25tZW50IGFuZCBhbm90aGVyICByZXBvcnQgb2YgdGhlIHNhbWUgdGhpbmcuICANCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojVE9QIE1FTlRJT05TIHBsb3QNCmdncGxvdChlbmNhX25ld3NfbWVudGlvbnMsIGFlcyh4ID0gcmVvcmRlcihtZW50aW9ucywgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIE1lbnRpb25zIGluIGVOQ0EgVHdlZXRzIikNCmBgYA0KDQpUaGUgYmFyIGNoYXJ0IHNob3dpbmcgdGhlIHRvcCBtZW50aW9ucyBpbiBlTkNBIHR3ZWV0cyBpbmRpY2F0ZXMgdGhhdCAoaW4gZGVzY2VuZGluZyBvcmRlcikg4oCcQFNhbGx5QnVyZGV0dFNB4oCdLCDigJxAQWJzYVNvdXRoQWZyaWNhLCDigJxARmFpdGhNYW5nb3Bl4oCdLCDigJxAQmV0dGVyQm9uZFNB4oCdLCDigJxAR2FyZXRoRWR3YXJkc1NB4oCdLCDigJxAQUJ3YW5ha2F3YeKAnSwg4oCcQFNpcGhhbWFuZGxhR29nZeKAnSwg4oCcQFRoZVJlYWxDbGVtZW50TeKAnSwg4oCcQE1hc2Vnb1JhaGxhZ2HigJ0gYW5kIOKAnEByZXZ1ZeKAnSBhcmUgdGhlIHRvcCBtZW50aW9ucyBpbiB0aGVpciB0d2VldHMuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI1RPUCAxMCB3b3Jkcw0KZ2dwbG90KGVuY2FfbmV3c193b3JkcywgYWVzKHggPSByZW9yZGVyKHdvcmQsIG4pLCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikrDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfaGMoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSANCiAgZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxLCBzaXplPTgpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZT0xNSkpKw0KICB5bGFiKCJGcmVxdWVuY3kiKSsNCiAgeGxhYigiIikrDQogIGdndGl0bGUoIlRvcCBXb3JkcyBpbiBlTkNBIFR3ZWV0cyIpDQoNCmBgYA0KDQpUaGUgYmFyIGNoYXJ0IHNob3dpbmcgdGhlIHRvcCB3b3JkcyBpbiBlTkNBIHR3ZWV0cyBpbmRpY2F0ZSB0aGF0IChpbiBkZXNjZW5kaW5nIG9yZGVyKSDigJxjb3ZpZDE54oCdLCDigJxzb3V0aOKAnSwg4oCccHJlc2lkZW504oCdLCDigJxBZnJpY2HigJ0sIOKAnGNvdXJ04oCdLCDigJxBZnJpY2Fu4oCdLCDigJxoZWFsdGjigJ0sIOKAnHBlb3BsZeKAnSwg4oCcbWluaXN0ZXLigJ0gYW5kIOKAnHZpZGVv4oCdIGFyZSB0aGUgdG9wIHdvcmRzIHVzZWQgaW4gdGhlaXIgdHdlZXRzLiBGcm9tIHRoaXMgZmlndXJlLCBpdCBpcyBpbmRpY2F0ZWQgdGhhdCB0aGUgdGVybSDigJxjb3ZpZDE54oCdIGlzIHRoZSBtb3N0IHByZXZhbGVudCB0ZXJtIGluIHRoZSBlTkNBIHR3ZWV0cyBjb2xsZWN0ZWQuIA0KDQojIyBTb3V0aCBBZnJpY2FuIEdvdmVybm1lbnQgKEBHb3Zlcm5tZW50WkEpDQoNClRoZSBTb3V0aCBBZnJpY2FuIEdvdmVybm1lbnQgYWNjb3VudCB3YXMgY2hvc2VuIGJlY2F1c2UgaXQgaXMgYW4gb2ZmaWNpYWwgYWNjb3VudCBvZiB0aGUgZ292ZXJubWVudCwgcHJvdmlkaW5nIGFjY3VyYXRlIGFuZCB0cnVzdHdvcnRoeSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIENPVklELTE5IHBhbmRlbWljIGFuZCBsb2NrZG93biByZWd1bGF0aW9ucy4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0KI0dvdmVybm1lbnRaQSBUaW1lbGluZSBGcmVxdWVuY3kgDQp0c19wbG90KEdvdmVybm1lbnRaQV90aW1lbGluZV9kZiwgY29sb3IgPSAiIzAwQURCNSIsIHNpemUgPSAxKSArDQogIHRoZW1lX2hjKCkgKw0KICBsYWJzKHRpdGxlID0gIkZyZXF1ZW5jeSBvZiBTQSBHb3Zlcm5tZW50IEFjY291bnQgVHdlZXRzIiwgDQogICAgICAgY2FwdGlvbj0iVXBkYXRlZDogSnVseSAyMDIxIikgKw0KICB5bGFiKCJGcmVxdWVuY3kiKQ0KYGBgDQoNClRoZSBTQSBHb3Zlcm5tZW50IHRpbWUgc2VyaWVzIGdyYXBoIHNob3dzIHRoYXQgdGhlIGFjY291bnQgZG9lcyBub3QgcG9zdCB0d2VldHMgdmVyeSByZWd1bGFybHksIGF2ZXJhZ2luZyBsZXNzIHRoYW4gMjUgdHdlZXRzIGEgd2VlayBhbmQgdGhlaXIgcGFzdCAzMjAwIHR3ZWV0cyBzcGFuIGZpdmUgbW9udGhzLiBUaGVyZSB3YXMgYSBzcGlrZSBpbiBpbiB0d2VldHMgYXJvdW5kIE1hcmNoIDIwMjEuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IHNoYXJlZCB0d2VldHMNCkdvdmVybm1lbnRaQV9maWcgPC0gcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjUwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBGcmVxdWVudGx5IFNoYXJlZCBUd2VldDwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBHb3ZaQV9zaGFyZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpHb3Zlcm5tZW50WkFfZmlnDQpgYGANCg0KVGhlIHRhYmxlIHNob3dpbmcgdGhlIG1vc3QgZnJlcXVlbnRseSBzaGFyZWQgdHdlZXQgYXMgb2YgSnVseSAyMDIxIGlzIHJlZ2FyZGluZyBQcmVzaWRlbnQgQ3lyaWwgUmFtYXBob3Nh4oCZcyBhZGRyZXNzIHRvIHRoZSBuYXRpb24gd2l0aCByZWdhcmRzIHRvIHRoZSBDT1ZJRC0xOSBwYW5kZW1pYyBvbiAxIEZlYnJ1YXJ5IDIwMjEuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNIYXNodGFnIHBsb3QNCmdncGxvdChHb3Zlcm5tZW50WkFfZGZfaGFzaHRhZ3MsIGFlcyh4ID0gcmVvcmRlcihoYXNodGFnLCBuKSwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgSGFzaHRhZ3MgaW4gU0EgR292ZXJubWVudCBUd2VldHMiKQ0KYGBgDQoNClRoZSBiYXIgY2hhcnQgc2hvd2luZyB0aGUgdG9wIGhhc2h0YWdzIGluIFNBIEdvdmVybm1lbnQgdHdlZXRzIGluZGljYXRlcyB0aGF0IChpbiBkZXNjZW5kaW5nIG9yZGVyKSDigJwjQ09WSUQxOeKAnSwg4oCcI1N0YXlTYWZl4oCdLCDigJwjVmFjY2luYXRlVG9TYXZlU291dGhBZnJpY2HigJ0sIOKAnCNTT05BMjAyMeKAnSwg4oCcI0NPVklEMTlTQeKAnSwg4oCcI0Nob29zZVZhY2NpbmF0aW9u4oCdLCDigJwjR3Jvd1NvdXRoQWZyaWNh4oCdLCDigJwjVmFjY2luZVJvbGxvdXRTQeKAnSwg4oCcI1JJUCBKYWNrc29uTXRoZW1ideKAnSwg4oCcUG9zdENhYmluZXTigJ0gYW5kIOKAnCNDb3ZpZDE5U0HigJ0uIEZyb20gdGhpcyBmaWd1cmUgaXQgY2FuIGJlIHNlZW4gdGhhdCAgbWFqb3JpdHkgb2YgdGhlIHRvcCB0ZXJtcyByZWZlciB0byB0aGUgQ09WSUQtMTkgcGFuZGVtaWMgb3IgdGhlIHZhY2NpbmF0aW9uIG9mIFNvdXRoIEFmcmljYW5zLiAgDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI01vc3QgbGlrZWQgVHdlZXRzIFBsb3QNCkdvdmVybm1lbnRaQV9maWcxIDwtIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI1MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgTGlrZWQgVHdlZXRzPC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IEdvdlpBX2xpa2VfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0KR292ZXJubWVudFpBX2ZpZzENCmBgYA0KDQpUaGUgdGFibGUgc2hvd2luZyB0aGUgbW9zdCBsaWtlZCB0d2VldHMgaW5kaWNhdGVzIHRoYXQgdGhlIGZvbGxvd2luZyBhcmUgdGhlIHRvcCBmaXZlIG1vc3QgIGxpa2VkIHR3ZWV0cyAoaW4gZGVzY2VuZGluZyBvcmRlcik6IGZpcnN0IHNoaXBtZW50IG9mIE94Zm9yZCBBc3RyYVplbmVjYSB2YWNjaW5lIGRvc2VzLCB0aGUgZmlyc3QgaGVhbHRoY2FyZSB3b3JrZXIgdmFjY2luYXRlZCBpbiBTb3V0aCBBZnJpY2EsIGFuIGFubm91bmNlbWVudCBpbmRpY2F0aW5nIHRoYXQgUHJlc2lkZW50IFJhbWFwaG9zYSB3aWxsIG1lZXQgdGhlIGFycml2aW5nIHNoaXBtZW50IG9mIE94Zm9yZCBBc3RyYVplbmVjYSB2YWNjaW5lcywgUklQIG5vdGljZSBvZiBKYWNrc29uIE1ldGhlbWJ1ICBhbmQgYSByZXBvcnQgdGhhdCB0aGUgUHJlc2lkZW50IHdpbGwgYWRkcmVzcyB0aGUgbmF0aW9uIG9uIDMwIE1heSAyMDIxIHdpdGggcmVnYXJkcyB0byB0aGUgQ09WSUQtMTkgcGFuZGVtaWMuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3AgbWVudGlvbnMgcGxvdA0KZ2dwbG90KEdvdmVybm1lbnRaQV9tZW50aW9ucywgYWVzKHggPSByZW9yZGVyKG1lbnRpb25zLCBuKSwgeSA9IG4pKSArDQogICAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikrDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfaGMoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSANCiAgZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxLCBzaXplPTgpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZT0xNSkpKw0KICB5bGFiKCJGcmVxdWVuY3kiKSsNCiAgeGxhYigiIikrDQogIGdndGl0bGUoIlRvcCBNZW50aW9ucyBpbiBTQSBHb3Zlcm5tZW50IFR3ZWV0cyIpDQpgYGANCg0KVGhlIGJhciBjaGFydCBzaG93aW5nIHRoZSB0b3AgbWVudGlvbnMgaW4gU0EgR292ZXJubWVudCB0d2VldHMgaW5kaWNhdGVzIHRoYXQgKGluIGRlc2NlbmRpbmcgb3JkZXIpIOKAnEBDeXJpbFJhbWFwaG9zYeKAnSwg4oCcQERyWndlbGllTWtoaXpl4oCdLCDigJxAR292dmVybm1lbnRaQeKAnSwg4oCcQEhlYWx0aFpB4oCdLCDigJxARERNYWJ1emHigJ0sIOKAnEBQYXJsaW1lbnRvZlJTQeKAnSwg4oCcQFNBUG9saWNlU2VydmljZeKAnSwg4oCcQERCRVNB4oCdLCDigJxASGlnaGVyRWR1R292WkHigJ0gYW5kIOKAnEBHQ0lTTWVkaWHigJ0gYXJlIHRoZSB0b3AgbWVudGlvbnMgaW4gdGhlaXIgdHdlZXRzLg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUT1AgbWVudGlvbnMgcGxvdA0KZ2dwbG90KEdvdmVybm1lbnRaQV9kZl93b3JkcywgYWVzKHggPSByZW9yZGVyKHdvcmQsIG4pLCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikrDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfaGMoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSANCiAgZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxLCBzaXplPTgpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZT0xNSkpKw0KICB5bGFiKCJGcmVxdWVuY3kiKSsNCiAgeGxhYigiIikrDQogIGdndGl0bGUoIlRvcCBXb3JkcyBpbiBTQSBHb3Zlcm5tZW50IFR3ZWV0cyIpDQoNCmBgYA0KDQpUaGUgYmFyIGNoYXJ0IHNob3dpbmcgdGhlIHRvcCB3b3JkcyBpbiBTQSBHb3Zlcm5tZW50IHR3ZWV0cyBpbmRpY2F0ZSB0aGF0IChpbiBkZXNjZW5kaW5nIG9yZGVyKSDigJxwcmVzaWRlbnTigJ0sIOKAnG1pbmlzdGVy4oCdLCDigJxzb3V0aOKAnSwg4oCccmFtYXBob3Nh4oCdLCDigJx0b3RhbOKAnSwg4oCcYWZyaWNh4oCdLCDigJx3YXRjaOKAnSwg4oCcc2HigJ0sIOKAnHZhY2NpbmF0aW9u4oCdIGFuZCDigJxsaXZl4oCdIGFyZSB0aGUgdG9wIHdvcmRzIHVzZWQgaW4gdGhlaXIgdHdlZXRzLiBGcm9tIHRoaXMgZmlndXJlLCBpdCBpcyBpbmRpY2F0ZWQgdGhhdCB0aGUgdGVybSDigJx2YWNjaW5hdGlvbuKAnSBpcyBhbiBpbXBvcnQgYW5kIHByZXZhbGVudCB0ZXJtIGluIHRoZSBpbiB0aGUgU0EgR292ZXJubWVudCB0d2VldHMgY29sbGVjdGVkLiANCg0KIyMgU291dGggQWZyaWNhbiBHb3Zlcm5tZW50IE5ld3MgKEBTQWdvdm5ld3MpDQoNCk9mZmljaWFsIFNvdXRoIEFmcmljYW4gR292ZXJubWVudCBOZXdzIEFjY291bnQgb24gdGhlIFR3aXR0ZXIgUGxhdGZvcm0uDQoNCmBgYHtyIFNBZ292bmV3cyBwbG90cywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQoNCiNTQWdvdm5ld3MgVGltZWxpbmUgRnJlcXVlbmN5DQp0c19wbG90KFNBZ292bmV3c190aW1lbGluZV9kZiwgY29sb3IgPSAiIzAwQURCNSIsIHNpemUgPSAxKSArDQogIHRoZW1lX2hjKCkgKw0KICBsYWJzKHRpdGxlID0gIkZyZXF1ZW5jeSBvZiBTQSBHb3Zlcm5tZW50IE5ld3MgQWNjb3VudCBUd2VldHMiLA0KICAgICAgIGNhcHRpb24gPSAiVXBkYXRlZDogSnVseSAyMDIxIikgKw0KICB5bGFiKCJGcmVxdWVuY3kiKQ0KYGBgDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI01vc3QgbGlrZWQgVHdlZXRzIFBsb3QNClNBZ292bmV3c19maWcxIDwtIA0KICBwbG90X2x5KA0KICB0eXBlID0gJ3RhYmxlJywNCiAgY29sdW1ub3JkZXIgPSBjKDEsMiksDQogIGNvbHVtbndpZHRoID0gYygyNTAsNDAwKSwNCiAgaGVhZGVyID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBjKCc8Yj5Nb3N0IExpa2VkIFR3ZWV0czwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBTQWdvdm5ld3NfbGlrZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpTQWdvdm5ld3NfZmlnMQ0KYGBgDQpBbW9uZyB0aGUgdG9wIDUgbW9zdCBsaWtlZCB0d2VldHMgZnJvbSB0aGUg4oCYQFNBZ292bmV3c+KAmSBhY2NvdW50IG5vbmUgc2VlbSB0byBob2xkIHJlbGV2YW50IGluZm9ybWF0aW9uIG9uIGNvdmlkIDE5LiANCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojSGFzaHRhZyBwbG90DQpnZ3Bsb3QoU0Fnb3ZuZXdzX2RmX2hhc2h0YWdzLCBhZXMoeCA9IHJlb3JkZXIoaGFzaHRhZywgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIEhhc2h0YWdzIGluIFNBIEdvdmVybm1lbnQgTmV3cyBUd2VldHMiKQ0KYGBgDQpUb3AgaGFzaHRhZ3MgYXJlIHN0cnVjdHVyZWQgYXMgZm9sbG93czogMS4g4oCYI0NPVklEMTnigJksIDIuIOKAmCNTT05BMjAyMeKAmSwgMy4g4oCYI1ZhY2NpbmVSb2xsb3V0U0HigJksIDQuIOKAmCNQb3N0Q2FiaW5ldOKAmSwgNS4g4oCYI1N0YXlTYWZl4oCZLCA2LiDigJgjUmFtYXBob3NhUWFuZEHigJksIDcuIOKAmCNQb3N0Q2FiTWVkaWFCcmllZmluZ+KAmSwgOC4g4oCYI0J1aWxkaW5nQU5ld0Vjb25vbXnigJksIDkuIOKAmCNDcmltZVN0YXRpc3RpY3PigJkgMTAuIOKAmCNGcmVlZG9tRGF5MjAyMeKAmQ0KDQpgYGB7ciAgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojTW9zdCBzaGFyZWQgdHdlZXRzIHBsb3QNClNBZ292bmV3c19maWcgPC0gcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjUwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBGcmVxdWVudGx5IFNoYXJlZCBUd2VldDwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBTQWdvdm5ld3Nfc2hhcmVfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0KU0Fnb3ZuZXdzX2ZpZw0KYGBgDQpUaGUgb2ZmaWNpYWwgbmV3cyBhZ2VuY3kgb2YgdGhlIFNvdXRoIEFmcmljYW4gR292ZXJubWVudOKAmXMgbW9zdCBmcmVxdWVudGx5IHNoYXJlZCB0d2VldCBpcyBub3QgcmVsZXZhbnQgdG8gdGhpcyByZXBvcnQuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3AgbWVudGlvbnMgcGxvdA0KZ2dwbG90KFNBZ292bmV3c19kZl9tZW50aW9ucywgYWVzKHggPSByZW9yZGVyKG1lbnRpb25zLCBuKSwgeSA9IG4pKSArDQogICAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikrDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfaGMoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSANCiAgZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxLCBzaXplPTgpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZT0xNSkpKw0KICB5bGFiKCJGcmVxdWVuY3kiKSsNCiAgeGxhYigiIikrDQogIGdndGl0bGUoIlRvcCBNZW50aW9ucyBpbiBTQSBHb3Zlcm5tZW50IE5ld3MgVHdlZXRzIikNCmBgYA0KVGhlIHRvcCBtZW50aW9ucyB3aXRoaW4gdGhlIGNhcHR1cmVkIHR3ZWV0cyBvZiDigJhAU0Fnb3ZuZXdz4oCZIGFyZTogMS4g4oCYQEN5cmlsUmFtYXBob3Nh4oCZIDIuIOKAmEBIZWFsdGhaQeKAmSAzLiDigJhARHJad2VsaU1raGl6ZeKAmSA0LiDigJhAUHJlc2lkZW5jeVpB4oCZIDUuIOKAmEBTQVBvbGljZVNlcnZpY2XigJkuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI1RvcCB3b3JkcyBwbG90DQpnZ3Bsb3QoU0Fnb3ZuZXdzX2RmX3dvcmRzLCBhZXMoeCA9IHJlb3JkZXIod29yZCwgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIFdvcmRzIGluICBTQSBHb3Zlcm5tZW50IE5ld3MgVHdlZXRzIikNCg0KYGBgDQpUaGUgbW9zdCBmcmVxdWVudGx5IHVzZWQgd29yZCBpcyDigJhyZWFk4oCZLCBkdWUgdG8gdGhlIGFjY291bnQgdXNpbmcgaXQgYXMgYW4gaW5kaWNhdGlvbiBvZiBleHRlbmRlZCByZWFkaW5nIG1hdGVyaWFsIHRocm91Z2ggdXNpbmcg4oCcW1JlYWRd4oCdIGluIHRoZSBiZWdpbm5pbmcgb2YgY2VydGFpbiB0d2VldHMuIA0KDQojIyBIZWFsdGgyNCAoQEhlYWx0aDI0Y29tKQ0KDQpIZWFsdGgyNCBpcyBhIGJyYW5jaCBvZiBOZXdzMjQsIGRpZmZlcmVuY2UgYmVpbmcgdGhhdCB0aGV5IHNwZWNpYWxpc2UgaW4gaGVhbHRoY2FyZSByZWxhdGVkIG5ld3MsIHdoZXJlYXMgTmV3czI0IHRha2VzIGEgbW9yZSBnZW5lcmFsIGFwcHJhb2NoLiANCmBgYHtyIEhFQUxUSDI0LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCg0KI0hlYWx0aDI0IFRpbWVsaW5lIEZyZXF1ZW5jeQ0KdHNfcGxvdChoZWFsdGgyNF90aW1lbGluZV9kZiwgY29sb3IgPSAiIzAwQURCNSIsIHNpemUgPSAxKSArDQogIHRoZW1lX2hjKCkgKw0KICBsYWJzKHRpdGxlID0gIkZyZXF1ZW5jeSBvZiBIZWFsdGgyNCBUd2VldHMiLCANCiAgICAgICBjYXB0aW9uID0gIlVwZGF0ZWQ6IEp1bHkgMjAyMSIpICsNCiAgeWxhYigiRnJlcXVlbmN5IikNCmBgYA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IGxpa2VkIFR3ZWV0cyBQbG90DQpoZWFsdGgyNF9maWcxIDwtIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI1MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgTGlrZWQgVHdlZXRzPC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGhlYWx0aDI0X2xpa2VfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0KaGVhbHRoMjRfZmlnMQ0KYGBgDQpUaGUgNHRoIG1vc3QgbGlrZWQgdHdlZXQgb2YgSGVhbHRoMjQgcGVydGFpbnMgdGhhdCBvZiBhbiBhcnRpY2xlIGRlc2NyaWJpbmcgdGhlIGx1bmdzIG9mIENPVklELTE5IHBhdGllbnRzLCB0aGUgb25seSBIZWFsdGgyNCB0d2VldCByZWxldmFudCBvbiB0aGlzIHBsb3QuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI0hhc2h0YWcgcGxvdA0KZ2dwbG90KGhlYWx0aDI0X2RmX2hhc2h0YWdzLCBhZXMoeCA9IHJlb3JkZXIoaGFzaHRhZywgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIEhhc2h0YWdzIGluIGhlYWx0aDI0IFR3ZWV0cyIpDQpgYGANClRvcCBoYXNodGFncyBhcmUgc3RydWN0dXJlZCBhcyBmb2xsb3dzOiAxLiDigJgjQmV5b25kQmVhdXR54oCZLCAyLiDigJgjU2tpbkNhcmXigJksIDMuIOKAmCNjb3JvbmF2aXJ1c+KAmSwgNC4g4oCYI0NvdmlkMTnigJksIDUuIOKAmCNTa2luUmVuZXdhbFNB4oCZLCA2LiDigJgjYXN0aG1h4oCZLCA3LiDigJgjVGVuYeKAmSwgOC4g4oCYI2JleW9uZGJlYXV0eeKAmSwgOS4g4oCYI1NraW5SZW5ld2Fs4oCZIDEwLiDigJgjQ29yb25hdmlydXPigJkNCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojTW9zdCBmcmVxdWVudCBzaGFyZWQgdHdlZXRzDQpoZWFsdGgyNF9maWcgPC0gcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjgwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBGcmVxdWVudGx5IFNoYXJlZCBUd2VldDwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBoZWFsdGgyNF9zaGFyZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpoZWFsdGgyNF9maWcNCmBgYA0KVGhlIG1vc3QgZnJlcXVlbnRseSBzaGFyZWQgdHdlZXQgY29uY2VybnMgdGhlIHBzeWNob2xvZ2ljYWwgaW1wbGljYXRpb25zIG9uIGRvY3RvcnMgYmVjYXVzZSBvZiB0aGUgQ09WSUQtMTkgZXBpZGVtaWMuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI1RvcCBtZW50aW9ucyBwbG90DQpnZ3Bsb3QoaGVhbHRoMjRfZGZfbWVudGlvbnMsIGFlcyh4ID0gcmVvcmRlcihtZW50aW9ucywgbiksIHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgTWVudGlvbnMgaW4gaGVhbHRoMjQgVHdlZXRzIikNCmBgYA0KVGhlIHRvcCBtZW50aW9ucyB3aXRoaW4gdGhlIGNhcHR1cmVkIHR3ZWV0cyBvZiDigJhAU0Fnb3ZuZXdz4oCZIGFyZTogMS4g4oCYQEN5cmlsUmFtYXBob3Nh4oCZIDIuIOKAmEBIZWFsdGhaQeKAmSAzLiDigJhARHJad2VsaU1raGl6ZeKAmSA0LiDigJhAUHJlc2lkZW5jeVpB4oCZIDUuIOKAmEBTQVBvbGljZVNlcnZpY2XigJkuDQoNCmBgYHtyICByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3AgMTAgd29yZHMNCmdncGxvdChoZWFsdGgyNF9kZl93b3JkcywgYWVzKHggPSByZW9yZGVyKHdvcmQsIG4pLCB5ID0gbikpICsNCiAgICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIFdvcmRzIGluIGhlYWx0aDI0IFR3ZWV0cyIpDQoNCmBgYA0KVGhlIDR0aCBtb3N0IGZyZXF1ZW50bHkgdXNlZCB3b3JkIGlzIOKAmGhlYWx0aOKAmSwgZm9sbG93ZWQgYnkg4oCYY292aWQxOeKAmSBhdCA3dGggcGxhY2UuIFRob3NlIGFyZSBzb2xlbHkgYXBwbGljYWJsZSB0byB0aGlzIHJlcG9ydC4gDQoNCiMjIEFsbCBDaG9zZW4gTWVkaWEgVHdlZXQgRGF0YSBBbmFseXNpcw0KDQpUaGUgZm9sbG93aW5nIHNlY3Rpb24gaXMgdGhlIGFuYWx5c2lzIG9mIHRoZSBhbGwgdGhlIFR3aXR0ZXIgYWNjb3VudHMgY29tYmluZWQuIA0KDQpgYGB7ciBhbGxfbWVkaWEsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KI0NvbXBsZXRlIG1lZGlhIHNvdXJjZSBUaW1lbGluZSBGcmVxdWVuY3kNCnRzX3Bsb3QoY29tcGxldGVfZGF0YV9zb3VyY2VfZGYsIGNvbG9yID0gIiMwMEFEQjUiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJGcmVxdWVuY3kgb2YgVHdlZXRzIGZyb20gYWxsIE1lZGlhIFNvdXJjZXMiLCANCiAgICAgICBjYXB0aW9uID0gIlVwZGF0ZWQ6IEp1bHkgMjAyMSIpICArDQogIHlsYWIoIkZyZXF1ZW5jeSIpDQpgYGANCg0KVGhlIG92ZXJhbGwgbWVkaWEgdGltZSBzZXJpZXMgZ3JhcGggc2hvd3MgdGhhdCB0aGUgY29sbGVjdGVkIHR3ZWV0IGRhdGEgc3BhbiBmcm9tIHRoZSBlbmQgb2YgMjAxNyB0aWxsIEp1bHkgMjAyMS4gRnJvbSB0aGUgc3RhcnQgdGlsbCAyMDIwLCB0aGUgdHdlZXQgZnJlcXVlbmN5IHdhcyByZWxhdGl2ZWx5IGxvdywgaG93ZXZlciBmb3JtIHRoZSBiZWdpbm5pbmcgb2YgMjAyMCB0aGVyZSB3YXMgYSBsYXJnZSBpbmNyZWFzZSB0d2VldHMuIFRoaXMgaW5jcmVhc2UgY2FuIHBvc3NpYmx5IGJlIGF0dHJpYnV0ZWQgdG8gdGhlIHN0YXJ0IG9mIGxvY2tkb3duIGluIFNvdXRoIEFmcmljYS4gRnJvbSB0aGUgc3RhcnQgb2YgMjAyMSB0aGVyZSBhcmUgZXZlbiBsYXJnZXIgaW5jcmVhc2VzIGNvbnRpbnVpbmcgYXMgdGltZSBnb2VzIGJ5LiANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KI01vc3QgZnJlcXVlbnQgc2hhcmVkIHR3ZWV0cw0KbWVkaWFfc2hhcmVfZmlnIDwtIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI1MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgRnJlcXVlbnRseSBTaGFyZWQgVHdlZXQ8L2I+PGJyPmFzIG9mIEp1bHkgMjAyMScsICc8Yj5Ud2VldCBEZXNjcmlwdGlvbjwvYj4nKSwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSAnIzAwQURCNScpLA0KICAgIGFsaWduID0gYygnbGVmdCcsJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3doaXRlJywgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSA0MA0KICApLA0KICBjZWxscyA9IGxpc3QoDQogICAgdmFsdWVzID0gbWVkaWFfc2hhcmVfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0KbWVkaWFfc2hhcmVfZmlnDQpgYGANCg0KVGhlIHRhYmxlIHNob3dpbmcgdGhlIG1vc3QgZnJlcXVlbnRseSBzaGFyZWQgdHdlZXQgYXMgb2YgSnVseSAyMDIxIGluZGljYXRlcyB0aGF0IHRoZSBtb3N0IHNoYXJlZCB0d2VldCBpcyByZWdhcmRpbmcgdGhlIGRlYXRoIG9mIFRCICBKb3NodWEuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KI01vc3QgbGlrZWQgVHdlZXRzIFBsb3QNCm1lZGlhX2ZpZzEgPC0gcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjgwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBMaWtlZCBUd2VldHM8L2I+PGJyPmFzIG9mIEp1bHkgMjAyMScsICc8Yj5Ud2VldCBEZXNjcmlwdGlvbjwvYj4nKSwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSAnIzAwQURCNScpLA0KICAgIGFsaWduID0gYygnbGVmdCcsJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3doaXRlJywgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSA0MA0KICApLA0KICBjZWxscyA9IGxpc3QoDQogICAgdmFsdWVzID0gbWVkaWFfbGlrZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQptZWRpYV9maWcxDQpgYGANCg0KVGhlIHRhYmxlIHNob3dpbmcgdGhlIG1vc3QgbGlrZWQgdHdlZXRzIGluZGljYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcgYXJlIHRoZSBtb3N0IGxpa2VkIHR3ZWV0cyAoaW4gZGVzY2VuZGluZyBvcmRlcik6IEEgcHJpbmNpcGFsIChEciBOZ3dha28gU3RlcGhlbiBTZWJvcGV0c2EpIGluIExpbXBvcG8gZ2l2ZW4gYSBnbG9iYWwgYXdhcmQsIHRoZSBwb2xpdGljYWwgdW5yZXN0IGluIEVzd2F0aW5pLCB0aGUgcmVzaWduYXRpb24gb2YgUGh1bXppbGUgdmFuIERhbW1lIGFzIERBIE1QIGFuZCBwYXJ0eSBtZW1iZXIsIHRoZSBwYXNzaW5nIG9mIFNoYWxlZW4gU3VydGllIFJpY2hhcmRzIGFuZCB0aGUgcG9zdHBvbmVtZW50IG9mIFp1bWHigJlzIGFycmVzdCBwZW5kaW5nIENvbkNvdXJ0IGFwcGxpY2F0aW9uLiANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KYWxsX21lZGlhX2hhc2h0YWdzIDwtIA0KICBjb21wbGV0ZV9kYXRhX3NvdXJjZV9kZiAlPiUgDQogIHVubmVzdF90b2tlbnMoaGFzaHRhZywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChoYXNodGFnLCAiXiMiKSkgJT4lDQogIGNvdW50KGhhc2h0YWcsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCmdncGxvdChhbGxfbWVkaWFfaGFzaHRhZ3MsIGFlcyh4ID0gcmVvcmRlcihoYXNodGFnLCBuKSwgeSA9IG4pLCBjb2xvciA9IGhhc2h0YWcpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikgKw0KICBnZ3RpdGxlKCJUb3AgVGVuIEhhc2h0YWdzIGluIENob3NlbiBNZWRpYSBUd2VldHMiKSArDQogIHlsYWIoIkZyZXF1ZW5jeSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTMpKSArIA0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHhsYWIoIkhhc2h0YWdzIikNCmBgYA0KDQpUaGUgYmFyIGNoYXJ0IHNob3dpbmcgdGhlIHRvcCBoYXNodGFncyBpbiBvdmVyYWxsIG1lZGlhIHR3ZWV0cyBpbmRpY2F0ZXMgdGhhdCAoaW4gZGVzY2VuZGluZyBvcmRlcikg4oCcI0NPVklEMTnigJ0sIOKAnCNEU1RWNDAz4oCdLCDigJwjZU5DQeKAnSwg4oCcI0NPVklEMTlTQeKAnSwg4oCcI1N0YXlTYWZl4oCdLCDigJwjQ29yb25hVmlydXNTQeKAnSwg4oCcI1ZhY2NpbmVSb2xsb3V0U0HigJ0sIOKAnCN2YWNjaW5l4oCdLCDigJwjQmhla2lzaXNhUmVzb3VyY2XigJ0gYW5kIOKAnFNPTkEyMDIx4oCdLiAgRnJvbSB0aGlzIGZpZ3VyZSBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBoYXNodGFncyBwZXJ0YWluaW5nIHRvIHRoZSBDT1ZJRC0xOSBwYW5kZW1pYyBhcmUgbW9zdCBwcmV2YWxlbnQuIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQphbGxfbWVkaWFfbWVudGlvbnMgPC0gDQogIGNvbXBsZXRlX2RhdGFfc291cmNlX2RmICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCmdncGxvdChhbGxfbWVkaWFfbWVudGlvbnMsIGFlcyh4ID0gcmVvcmRlcihtZW50aW9ucywgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSArDQogIGdndGl0bGUoIlRvcCBUZW4gTWVudGlvbnMgaW4gQ2hvc2VuIE1lZGlhIFR3ZWV0cyIpICsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB4bGFiKCJNZW50aW9ucyIpKw0KICB5bGFiKCJGcmVxdWVuY3kiKQ0KYGBgDQoNClRoZSBiYXIgY2hhcnQgc2hvd2luZyB0aGUgdG9wIG1lbnRpb25zIGluIHRoZSBvdmVyYWxsIG1lZGlhIHR3ZWV0cyBpbmRpY2F0ZXMgdGhhdCAoaW4gZGVzY2VuZGluZyBvcmRlcikg4oCcQEN5cmlsUmFtYXBob3Nh4oCdLCDigJxASGVhbHRoWkHigJ0sIOKAnEB2YW5keWtqb2Fu4oCdICAs4oCcQERyWndlbGllTWtoaXpl4oCdLCDigJxARmluMjTigJ0sIOKAnEBTcG9ydHMyNG5ld3PigJ0sIOKAnEBtaWFtYWxhbuKAnSwg4oCcQFdpdG5lc3NLWk7igJ0sIOKAnEBCbFNvdXRoQWZyaWNh4oCdIGFuZCDigJxATmtvUmFwaGFlbOKAnSBhcmUgdGhlIHRvcCBtZW50aW9ucyBpbiB0aGUgb3ZlcmFsbCBtZWRpYSB0d2VldHMuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmFsbF9tZWRpYV93b3JkcyA8LSANCiAgY29tcGxldGVfZGF0YV9zb3VyY2VfZGYgJT4lDQogIG11dGF0ZSh0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIiZhbXA7fCZsdDt8Jmd0OyIpLA0KICB0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIlxccz8oZnxodCkodHApKHM/KSg6Ly8pKFteXFwuXSlbXFwufC9dKFxcUykiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJbXlx4MDEtXHg3Rl0iKSkgJT4lIA0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQsIHRva2VuID0gInR3ZWV0cyIpICU+JQ0KICBmaWx0ZXIoIXdvcmQgJWluJSBzdG9wX3dvcmRzJHdvcmQsDQogICF3b3JkICVpbiUgc3RyX3JlbW92ZV9hbGwoc3RvcF93b3JkcyR3b3JkLCAiJyIpLA0KICBzdHJfZGV0ZWN0KHdvcmQsICJbYS16XSIpLA0KICAhc3RyX2RldGVjdCh3b3JkLCAiXiMiKSwgDQogICFzdHJfZGV0ZWN0KHdvcmQsICJAXFxTKyIpKSAlPiUNCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCg0KZ2dwbG90KGFsbF9tZWRpYV93b3JkcywgYWVzKHggPSByZW9yZGVyKHdvcmQsIG4pLCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikgKw0KICBnZ3RpdGxlKCJUb3AgVGVuIE1vc3QgUHJldmFsZW50IFdvcmRzIGluIENob3NlbiBNZWRpYSBUd2VldHMiKSArDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfaGMoKSsNCiAgeGxhYigiV29yZCIpKw0KICB5bGFiKCJGcmVxdWVuY3kiKQ0KYGBgDQoNClRoZSBiYXIgY2hhcnQgc2hvd2luZyB0aGUgdG9wIHdvcmRzIGluIHRoZSBvdmVyYWxsIHR3ZWV0cyBpbmRpY2F0ZSB0aGF0IChpbiBkZXNjZW5kaW5nIG9yZGVyKSDigJxzb3V0aOKAnSwg4oCcY292aWQxOeKAnSwg4oCcdG90YWzigJ0sIOKAnHByZXNpZGVudOKAnSwg4oCcYWZyaWNh4oCdLCDigJx0b3RhbOKAnSwg4oCccmVhZOKAnSwg4oCcbWluaXN0ZXLigJ0sIOKAnGhlYWx0aOKAnSwg4oCcZGVhdGhz4oCdIGFuZCDigJxwZW9wbGXigJ0gYXJlIHRoZSB0b3Agd29yZHMgdXNlZCBpbiB0aGVpciB0d2VldHMuIEZyb20gdGhpcyBmaWd1cmUsIGl0IGlzIGluZGljYXRlZCB0aGF0IHRoZSB0ZXJtIOKAnGNvdmlkMTnigJ0gaXMgYW4gaW1wb3J0IGFuZCBwcmV2YWxlbnQgdGVybSBpbiB0aGUgaW4gdGhlIG92ZXJhbGwgbWVkaWEgdHdlZXRzIGNvbGxlY3RlZC4gDQoNCiMjIFdvcmQgQ2xvdWQgb2YgdGhlIENvcnB1cyBvZiBBbGwgQ29tYmluZWQgTWVkaWEgU291cmNlcw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojIFdvcmQgQ2xvdWQgb2YgQWxsIE1lZGlhIENvcnB1cw0KcGFsIDwtDQogIGJyZXdlci5wYWwoOCwgIkRhcmsyIikNCg0Kd29yZGNsb3VkKGFsbF9tZWRpYV9jb3JwdXMsIG1pbi5mcmVxPTIsIG1heC53b3JkcyA9IDE1MCwgcmFuZG9tLm9yZGVyID0gVFJVRSwgY29sID0gcGFsKQ0KYGBgDQoNCg0KIyBUb3BpYyBNb2RlbGluZw0KDQpUb3BpYyBtb2RlbGxpbmcgaXMgYSB0eXBlIG9mIG1ldGhvZCB1c2VkIGluIGNvbmR1Y3RpbmcgYSB0ZXh0IGFuYWx5c2lzIG9mIHdvcmRzIGdyb3VwZWQgdG9nZXRoZXIuIFRoZSBtZXRob2QgYWltcyB0byBkZXRlcm1pbmUgdGhlIGhvdyB0aGUgbWVhbmluZyBvZiB0aGUgd29yZHMgaXMgZGVyaXZlZCBmcm9tIHRoZSBjb250ZXh0IG9mIHRoZSB0ZXh0LiBUaGlzIGlzIG5vdCB0aGUgb25seSBtZXRob2QgdXNlZCB0byBhbmFseXNlIGdyb3VwZWQgd29yZHMsIG90aGVyIGV4YW1wbGVzIHN1Y2ggYXMgY2x1c3RlciBhbmFseXNpcyBhbmQgc2VtYW50aWMgYW5hbHlzaXMgYWxzbyBleGlzdC4gVGhlIGJlbmVmaXRzIG9mIHV0aWxpc2luZyBUb3BpYyBNb2RlbGxpbmcgaW5jbHVkZSBiZWluZyBhIG1peGVkIG1vZGVsIChlYWNoIGRvY3VtZW50IGlzIGdpdmVuIGEgcHJvYmFiaWxpdHkgb2YgYmVpbmcgbGlua2VkIHRvIGEgdG9waWMpIGFuZCB0aGlzIG1ldGhvZCBtYWtlcyB1c2Ugb2YgbW9yZSBhZHZhbmNlZCBpdGVyYXRpdmUgQmF5ZXNpYW4gdGVjaG5pcXVlcy4gKEJhaWwsIDIwMjApDQoNCiMjIFdoYXQgdG9waWNzIGhhdmUgYmVlbiByZXBvcnRlZCBvbjoNCg0KVGhlIG1haW4gdG9waWNzIHJlcG9ydGVkIG9uIGFyZSB0aGUgQ292aWQtMTkgcGFuZGVtaWMsIHZhY2NpbmF0aW9ucyBhbmQgdGhlIGxvY2tkb3duIGluIFNvdXRoIEFmcmljYS4NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KIyBUZXJtIEZyZXF1ZW5jeSBJbnZlcnNlIERvY3VtZW50IEZyZXF1ZW5jeQ0KDQojIENsZWFuIGFuZCBjcmVhdGUgIFRGSURGIHRhYmxlIGRhdGEgZnJhbWUNCg0KdGlkeV9hbGxfbWVkaWFfdGZpZGY8LSANCiAgam9pbnRfdGltZWxpbmVzICU+JQ0KICAgIHNlbGVjdChzY3JlZW5fbmFtZSx0ZXh0KSAlPiUNCiAgICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KSAlPiUNCiAgICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICAgICBjb3VudCh3b3JkLCBzY3JlZW5fbmFtZSkgJT4lDQogICAgICAgICAgICAgIGJpbmRfdGZfaWRmKHdvcmQsIHNjcmVlbl9uYW1lLCBuKQ0KDQojIERldGVybWluZSB0aGUgdG9wIHRlbiBURklERiB3b3Jkcw0KDQp0b3BfYWxsX21lZGlhX3RmaWRmPC0NCiAgdGlkeV9hbGxfbWVkaWFfdGZpZGYgJT4lDQogIGFycmFuZ2UoZGVzYyh0Zl9pZGYpKSAgJT4lDQogIGdyb3VwX2J5KHNjcmVlbl9uYW1lKSAlPiUNCiAgdG9wX24oMTApICU+JQ0KICB1bmdyb3VwDQoNCiMgUGxvdCBiYXIgY2hhcnQgc2hvd2luZyB0aGUgaGlnaGVzdCBURklERiB3b3JkcyBmb3IgZWFjaCBzZWxlY3RlZCBtZWRpYSBzb3VyY2UNCg0KdG9wX2FsbF9tZWRpYV90ZmlkZiAlPiUNCiAgICBtdXRhdGUod29yZCA9IHJlb3JkZXJfd2l0aGluKHdvcmQsIHRmX2lkZiwgc2NyZWVuX25hbWUpKSAlPiUNCiAgICBnZ3Bsb3QoYWVzKHdvcmQsIHRmX2lkZiwgZmlsbCA9IHNjcmVlbl9uYW1lKSkgKw0KICAgIGdlb21fY29sKGFscGhhID0gMC44LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogICAgZmFjZXRfd3JhcCh+IHNjcmVlbl9uYW1lLCBzY2FsZXMgPSAiZnJlZSIsIG5jb2wgPSAzKSArDQogICAgc2NhbGVfeF9yZW9yZGVyZWQoKSArDQogICAgY29vcmRfZmxpcCgpICsNCiAgICB0aGVtZShzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTExKSkgKw0KICAgIGxhYnMoeCA9IE5VTEwsIHkgPSAidGYtaWRmIiwNCiAgICAgICAgIHRpdGxlID0gIkhpZ2hlc3QgdGYtaWRmIHdvcmRzIGluIENob3NlbiBNZWRpYSBTb3VyY2VzIiwNCiAgICAgICAgIHN1YnRpdGxlID0gIkluZGl2aWR1YWwgTWVkaWEgU291cmNlcyBmb2N1cyBvbiBkaWZmZXJlbnQgd29yZCBlbGVtZW50cyIpDQpgYGANCg0KQSBjb2xsZWN0aW9uIG9mIGJhciBjaGFydHMgc2hvd2luZyB0aGUgd29yZHMgd2l0aCB0aGUgaGlnaGVzdCB0Zi1pZGYgZm9yIGVhY2ggb2YgdGhlIGNob3NlbiBzb3VyY2VzLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpkYXRhKHN0b3Bfd29yZHMpDQoNCiMgVG9rZW5pemUgc2VsZWN0ZWQgbWVkaWEgc291cmNlcw0KDQp3b3JkZWRfbWVkaWEgPC0gDQogIGpvaW50X3RpbWVsaW5lcyAlPiUgDQogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCkgJT4lDQogIGFudGlfam9pbihzdG9wX3dvcmRzKSANCg0KIyBDcmVhdGUgYSBEb2N1bWVudCBUZXJtIE1hdHJpeCBvZiBzZWxlY3RlZCBtZWRpYSBzb3VyY2VzDQoNCm1lZGlhX0RUTSA8LQ0KICB3b3JkZWRfbWVkaWEgJT4lDQogIGNvdW50KHNjcmVlbl9uYW1lLCB3b3JkKSAlPiUNCiAgY2FzdF9kdG0oc2NyZWVuX25hbWUsIHdvcmQsIG4pDQoNCiMgIENyZWF0ZSBhIHRvcGljIG1vZGVsIG9mIHNlbGVjdGVkIG1lZGlhIHNvdXJjZXMgd2l0aCBzaXggdG9waWNzDQoNCm1lZGlhX3RvcGljX21vZGVsIDwtIA0KICBMREEobWVkaWFfRFRNLCBrPTYsIGNvbnRyb2wgPSBsaXN0KHNlZWQgPSAzMjEpKQ0KDQojIENyZWF0ZSBhIGJldGEgbXRyaXggdG9waWMgbW9kZWwNCg0KbWVkaWFfdG9waWNzIDwtIA0KICB0aWR5KG1lZGlhX3RvcGljX21vZGVsLCBtYXRyaXggPSAiYmV0YSIpDQoNCiMgRGV0ZXJtaW5lIHRoZSB0b3AgdGVybXMNCg0KbWVkaWFfdG9wX3Rlcm1zIDwtIA0KICBtZWRpYV90b3BpY3MgJT4lDQogIGdyb3VwX2J5KHRvcGljKSAlPiUNCiAgdG9wX24oMTAsIGJldGEpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGFycmFuZ2UodG9waWMsIC1iZXRhKQ0KDQojIFBsb3QgYmFyIGNoYXJ0cyBzaG93aW5nIHRoZSBoaWdoZXN0IHdvcmQgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCB0b3BpYw0KDQptZWRpYV90b3BfdGVybXMgJT4lDQogIG11dGF0ZSh0ZXJtID0gcmVvcmRlcih0ZXJtLCBiZXRhKSkgJT4lDQogIGdncGxvdChhZXModGVybSwgYmV0YSwgZmlsbCA9IGZhY3Rvcih0b3BpYykpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UsIGZpbGwgPSAiIzAwQURCNSIpICsNCiAgZmFjZXRfd3JhcCh+IHRvcGljLCBzY2FsZXMgPSAiZnJlZSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJiZXRhIiwNCiAgICAgICAgIHRpdGxlID0gIkhpZ2hlc3Qgd29yZCBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHRvcGljIiwNCiAgICAgICAgIHN1YnRpdGxlID0gIkRpZmZlcmVudCB3b3JkcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCB0b3BpY3MiKQ0KYGBgDQoNCkEgY29sbGVjdGlvbiBvZiBiZXRhIGJhciBjaGFydHMgc2hvd2luZyB0aGUgd29yZHMgd2l0aCB0aGUgaGlnaGVzdCBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHRvcGljLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojIERldGVybWluZSB0aGUgdG9wIHRlbiBtZWRpYSB0b3BpY3MNCg0KYmV0YV93aWRlIDwtIA0KICBtZWRpYV90b3BpY3MgJT4lDQogIG11dGF0ZSh0b3BpYyA9IHBhc3RlMCgidG9waWMiLCB0b3BpYykpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gdG9waWMsIHZhbHVlc19mcm9tID0gYmV0YSkgJT4lIA0KICBmaWx0ZXIodG9waWMxID4gLjAwMSB8IHRvcGljMiA+IC4wMDEpICU+JQ0KICBtdXRhdGUobG9nX3JhdGlvID0gbG9nMih0b3BpYzIgLyB0b3BpYzEpKSAlPiUNCiAgdG9wX24oMTApDQoNCiMgUGxvdCB0b3AgdGVuIG1lZGlhIHRvcGljcw0KDQpnZ3Bsb3QoKSArDQogIGdlb21fY29sKGJldGFfd2lkZSwgDQogICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHJlb3JkZXIodGVybSwgdG9waWMxKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHRvcGljMSksDQogICAgICAgICAgIGZpbGwgPSAiIzAwQURCNSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgZ2d0aXRsZSgiVG9wIFRlbiBNZWRpYSBUb3BpY3MgQWNjb3JkaW5nIHRvIEJldGEgVG9waWMgTW9kZWwiKQ0KYGBgDQoNCkJhciBjaGFydCBzaG93aW5nIHRoZSB0b3AgdGVuIG1lZGlhIHRvcGljcyBhY2NvcmRpbmcgdG8gdGhlIEJldGEgTWF0cml4IG1lZGlhIHRvcGljIG1vZGVsIGF0IFRvcGljIDEgcHJvYmFiaWxpdGllcy4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCm1lZGlhX2dhbW1hIDwtDQogIHRpZHkobWVkaWFfdG9waWNfbW9kZWwsIG1hdHJpeCA9ICJnYW1tYSIsDQogICAgICAgZG9jdW1lbnRfbmFtZXMgPSByb3duYW1lcyhqb2ludF90aW1lbGluZXMpKQ0KDQpnZ3Bsb3QobWVkaWFfZ2FtbWEsIGFlcyhnYW1tYSwgZmlsbCA9IGFzLmZhY3Rvcih0b3BpYykpKSArDQogIGdlb21faGlzdG9ncmFtKGFscGhhID0gMC44LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGZhY2V0X3dyYXAofiB0b3BpYywgbmNvbCA9IDMpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2Ygd29yZCBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHRvcGljIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJFYWNoIHRvcGljIGlzIGFzc29jaWF0ZWQgd2l0aCBvbmUgc291cmNlIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBzb3VyY2VzIiwgeCA9IGV4cHJlc3Npb24oZ2FtbWEpKQ0KYGBgDQoNCkEgY29sbGVjdGlvbiBvZiBnYW1tYSBiYXIgY2hhcnRzIHNob3dpbmcgdGhlIGRpc3RyaWJ1dGlvbiBvZiB3b3JkIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggdG9waWMuDQoNCiMgIFRleHQgTmV0d29ya3MNCg0KVGV4dCBOZXR3b3JrcyBhcmUgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gd29yZHMuIFRoZXNlIG5ldHdvcmtzIGFyZSBhYmxlIHRvIHJlcHJlc2VudCBhIGNvcnB1cyBvZiBkb2N1bWVudHMgb3Igd29yZHMsIHdoZXJlIGVhY2ggZG9jdW1lbnQgb3Igd29yZCByZXByZXNlbnRzIGEgbm9kZSBhbmQgdGhlIGVkZ2VzIHdoaWNoIGNvbm5lY3Qgbm9kZXMgcmVwcmVzZW50IGhvdyBzaW1pbGFyIHdvcmRzIG9yIGRvY3VtZW50cyBhcmUgdG8gZWFjaCBvdGhlci4gSW4gdGhpcyByZXBvcnQsIHRleHQgbmV0d29ya3Mgd2VyZSB1c2VkIHRvIGRldGVybWluZSBob3cgZnJlcXVlbnQgd29yZHMgd291bGQgb2NjdXIgYWxvbmcgc2lkZSBlYWNoIG90aGVyLCB3aGVyZSB3b3JkcyByZXByZXNlbnQgbm9kZXMgYW5kIGVkZ2VzIHJlcHJlc2VudCB0aGUgZnJlcXVlbmN5IG9mIHRoZSB3b3Jkcycgb2NjdXJyZW5jZS4gKEJhaWwsIDIwMjApDQoNCk1hbnkgYmVuZWZpdHMgZXhpc3Qgd2hlbiB1c2luZyB0ZXh0IG5ldHdvcmtzLiBUZXh0IG5ldHdvcmtzIGhlbHAgcmVjb2duaXNlIGFuZCB1bmRlcnN0YW5kIHBhdHRlcm5zIHdpdGhpbiB0ZXh0IGFuZCBob3cgdGhleSBhcmUgY29ubmVjdGVkLiBUZXh0IG5ldHdvcmtzIGFyZSB3b3JrYWJsZSB3aXRoIHRleHQgb2YgYW55IGxlbmd0aCB3aGVyZWFzIHRvcGljIG1vZGVsbGluZyBvbmx5IHdvcmtzIHdpdGggc2hvcnQgdGV4dC4gQnkgaWRlbnRpZnlpbmcgc29jaWFsIGNsdXN0ZXJzIGluIHRleHRzIG1vcmUgaW5zaWdodCBjYW4gYmUgZGVyaXZlZCBmcm9tIHRleHQsIGFzIG9wcG9zZWQgdG8gbW9yZSBzaW1wbGUgdGV4dCBhbmFseXNpcyB0ZWNobmlxdWVzLg0KDQojIyBBdXRob3ItYmFzZWQgVGV4dCBOZXR3b3JrIE1vZGVsaW5nIG9mIEFsbCBNZWRpYSBTb3VyY2VzOg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGZpZy5wb3M9J0gnfQ0KDQojIFNsaWNlIGEgcG9ydGlvbiBvZiBjb21wbGV0ZV9kYXRhX3NvdXJjZV9kZiBncm91cGVkIGJ5IHNjcmVlbl9uYW1lDQoNCm1lZGlhX2NvbGxlY3Rpb25fdGV4dCA8LSANCiAgY29tcGxldGVfZGF0YV9zb3VyY2VfZGYgJT4lIA0KICBncm91cF9ieShzY3JlZW5fbmFtZSkgJT4lIA0KICBzbGljZSgxTCkNCg0KIyBQcmVwYXJlIHRoZSB0ZXh0IGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgYXV0aG9yLWJhc2VkIHRleHQgbmV0d29yaw0KDQphdXRob3JfcHJlcHBlZF9tZWRpYV90ZXh0IDwtDQogIFByZXBUZXh0KG1lZGlhX2NvbGxlY3Rpb25fdGV4dCwNCiAgICAgICAgICAgZ3JvdXB2YXIgPSAic2NyZWVuX25hbWUiLA0KICAgICAgICAgICB0ZXh0dmFyID0gInRleHQiLA0KICAgICAgICAgICBub2RlX3R5cGUgPSAiZ3JvdXBzIiwNCiAgICAgICAgICAgdG9rZW5pemVyID0gIndvcmRzIiwNCiAgICAgICAgICAgcG9zID0gIm5vdW5zIiwNCiAgICAgICAgICAgcmVtb3ZlX3N0b3Bfd29yZHMgPSBUUlVFLA0KICAgICAgICAgICBjb21wb3VuZF9ub3VucyA9IFRSVUUpDQoNCiMgQ3JlYXRlIGF1dGhvci1iYXNlZCB0ZXh0IG5ldHdvcmsNCg0KYXV0aG9yX21lZGlhX3RleHRfbmV0d29yayA8LSBDcmVhdGVUZXh0bmV0KGF1dGhvcl9wcmVwcGVkX21lZGlhX3RleHQpDQoNCiMgVmlzdWFsaXplIHRleHQgbmV0d29yayBpbiBhIDJEIGZvcm1hdA0KDQphdXRob3JfdmlzX21lZGlhXzJkIDwtDQogIFZpc1RleHROZXQoYXV0aG9yX21lZGlhX3RleHRfbmV0d29yaywNCiAgICAgICAgICAgICBhbHBoYSA9IDIsDQogICAgICAgICAgICAgbGFiZWxfZGVncmVlX2N1dCA9IDApDQoNCiMgUHJpbnQgMkQgYXV0aG9yLWJhc2VkIHRleHQgbmV0d29yayANCg0KYXV0aG9yX3Zpc19tZWRpYV8yZA0KDQojIFZpc3VhbGl6ZSB0ZXh0IG5ldHdvcmsgaW4gYSAzRCBmb3JtYXQNCg0KYXV0aG9yX3Zpc19tZWRpYSA8LSBWaXNUZXh0TmV0RDMoYXV0aG9yX21lZGlhX3RleHRfbmV0d29yaywNCiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSA1MDAsDQogICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSA1MDAsDQogICAgICAgICAgICAgICAgICAgICAgYm91bmQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgIHpvb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgIGNoYXJnZSA9IC0xMCwNCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDIpDQoNCiMgQ3JlYXRlIGFuZCBzYXZlIHRoZSB0ZXh0IG5ldHdvcmsgYXMgYW4gSFRNTCB3aWRnZXQNCg0Kc2F2ZVdpZGdldChhdXRob3JfdmlzX21lZGlhLCAiYXV0aG9yX21lZGlhX3RleHRfbmV0d29yay5odG1sIikNCg0KIyBQcmludCAzRCBhdXRob3ItYmFzZWQgdGV4dCBuZXR3b3JrIA0KDQphdXRob3JfdmlzX21lZGlhDQoNCiMgSWRlbnRpZnkgY2x1c3RlcnMgb3IgY29tbXVuaXRpZXMgb2Ygd29yZHMgd2l0aGluIHRoZSB0ZXh0DQoNCmF1dGhvcl9tZWRpYV9jb21tdW5pdGllcyA8LQ0KICBUZXh0Q29tbXVuaXRpZXMoYXV0aG9yX21lZGlhX3RleHRfbmV0d29yaykNCg0KIyBJbnRlcnByZXQgdGV4dCBhbmQgaWRlbnRpZnkgMTAgaGlnaGVzdCBURklERiBmcmVxdWVuY2llcyB3aXRoaW4gZWFjaCBjbHVzdGVyDQoNCnRvcF93b3Jkc19tb2R1bGFyaXR5X2NsYXNzZXMgPC0NCiAgSW50ZXJwcmV0VGV4dChhdXRob3JfbWVkaWFfdGV4dF9uZXR3b3JrLA0KICAgICAgICAgICAgICAgIGF1dGhvcl9wcmVwcGVkX21lZGlhX3RleHQpDQoNCiMgQ2FsY3VsYXRlIGN1bHR1cmFsIGJldHdlZW5uZXNzIG9yIHRleHQgY2VudHJhbGl0eSANCg0KdGV4dF9jZW50cmFsaXR5IDwtIA0KICBUZXh0Q2VudHJhbGl0eShhdXRob3JfbWVkaWFfdGV4dF9uZXR3b3JrKQ0KYGBgDQoNCkZyb20gdGhlIGF1dGhvci1iYXNlZCB0ZXh0IG5ldHdvcmsgZmlndXJlcyBhYm92ZSwgaXQgY2FuIGJlIHN1cm1pc2VkIHRoYXQgdGhlcmUgYXJlIHR3byBhdXRob3IgY2x1c3RlcnMgb3IgY29tbXVuaXRpZXMuIE9uZSB3aGljaCBjb25zaXN0cyBvZiBTQUJDIE5ld3MsICBTb3V0aCBBZnJpY2FuIEdvdmVybm1lbnQgTmV3cyBhbmQgSGVhbHRoMjQuY29tLiBBbm90aGVyIHdoaWNoIGNvbnNpc3RzIG9mIGVOQ0EsIEJoZWtpc2lzYSwgRVdOIGFuZCBOZXdzMjQuIEF0IGNsb3NlciBpbnNwZWN0aW9uLCBpdCBjYW4gYmUgIHNlZW4gdGhhdCB0aGVyZSBpcyBzdHJvbmdlciBzaW1pbGFyaXR5IGJldHdlZW4gU0EgR292ZXJubWVudCBOZXdzIGFuZCBIZWFsdGgyNC5jb20gdGhhbiBTQUJDIE5ld3MuIFRoZXJlIGlzIHN0cm9uZyBzaW1pbGFyaXR5IGJldHdlZW4gZU5DQSBhbmQgRVdOLCBCaGVraXNpc2EgYW5kIEVXTiwgYXMgd2VsbCBhcyBOZXdzMjQgYW5kIEVXTi4gSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlcmUgaXMgbm90IGEgc3Ryb25nIHNpbWlsYXJpdHkgYmV0d2VlbiBCaGVraXNpc2EgYW5kIGVOQ0EsIGFzIHdlbGwgYXMgYSBtb2RlcmF0ZSBzaW1pbGFyaXR5IGJldHdlZW4gRVdOIGFuZCBOZXdzMjQgd2hlbiBjb21wYXJlZCB0byBpdHMgb3RoZXIgY29ubmVjdGlvbnMuICAgICAgIA0KDQojIyBXb3JkLWJhc2VkIFRleHQgTmV0d29yayBNb2RlbGluZyBvZiBBbGwgTWVkaWEgU291cmNlczoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBmaWcucG9zPSdIJ30NCg0KIyBTbGljZSBhIHBvcnRpb24gb2Ygam9pbnRfdGltZWxpbmVzIGdyb3VwZWQgYnkgc2NyZWVuX25hbWUNCg0KbWVkaWFfY29sbGVjdGlvbl90ZXh0IDwtIA0KICBqb2ludF90aW1lbGluZXMgJT4lIA0KICBncm91cF9ieShzY3JlZW5fbmFtZSkgJT4lIA0KICBzbGljZSgxTCkNCg0KIyBQcmVwYXJlIHRoZSB0ZXh0IGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgd29yZC1iYXNlZCB0ZXh0IG5ldHdvcmsNCg0Kd29yZF9wcmVwcGVkX21lZGlhX3RleHQgPC0gDQogIFByZXBUZXh0KG1lZGlhX2NvbGxlY3Rpb25fdGV4dCwgDQogICAgICAgICAgIGdyb3VwdmFyID0gInNjcmVlbl9uYW1lIiwgDQogICAgICAgICAgIHRleHR2YXIgPSAidGV4dCIsIA0KICAgICAgICAgICBub2RlX3R5cGUgPSAid29yZHMiLCANCiAgICAgICAgICAgdG9rZW5pemVyID0gIndvcmRzIiwgDQogICAgICAgICAgIHBvcyA9ICJub3VucyIsIA0KICAgICAgICAgICByZW1vdmVfc3RvcF93b3JkcyA9IFRSVUUsIA0KICAgICAgICAgICBjb21wb3VuZF9ub3VucyA9IFRSVUUpDQoNCiMgQ3JlYXRlIHdvcmQtYmFzZWQgdGV4dCBuZXR3b3JrDQoNCndvcmRzX21lZGlhX3RleHRfbmV0d29yayA8LSBDcmVhdGVUZXh0bmV0KHdvcmRfcHJlcHBlZF9tZWRpYV90ZXh0KQ0KDQojIFZpc3VhbGl6ZSB0ZXh0IG5ldHdvcmsgaW4gYSAyRCBmb3JtYXQNCg0KVmlzVGV4dE5ldCh3b3Jkc19tZWRpYV90ZXh0X25ldHdvcmssDQogICAgICAgICAgIGFscGhhID0gMiwNCiAgICAgICAgICAgbGFiZWxfZGVncmVlX2N1dCA9IDApDQoNCiMgVmlzdWFsaXplIHRleHQgbmV0d29yayBpbiBhIDNEIGZvcm1hdA0KDQp3b3Jkc192aXNfbWVkaWEgPC0gVmlzVGV4dE5ldEQzKHdvcmRzX21lZGlhX3RleHRfbmV0d29yaywNCiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSA1MDAsDQogICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSA1MDAsDQogICAgICAgICAgICAgICAgICAgICAgYm91bmQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgIHpvb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgIGNoYXJnZSA9IC0xMCwNCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDIpDQoNCiMgQ3JlYXRlIGFuZCBzYXZlIHRoZSB0ZXh0IG5ldHdvcmsgYXMgYW4gSFRNTCB3aWRnZXQNCg0Kc2F2ZVdpZGdldCh3b3Jkc192aXNfbWVkaWEsICJ3b3Jkc19tZWRpYV90ZXh0X25ldHdvcmsuaHRtbCIpDQoNCiMgUHJpbnQgM0Qgd29yZC1iYXNlZCB0ZXh0IG5ldHdvcmsgDQoNCndvcmRzX3Zpc19tZWRpYQ0KDQojIElkZW50aWZ5IGNsdXN0ZXJzIG9yIGNvbW11bml0aWVzIG9mIHdvcmRzIHdpdGhpbiB0aGUgdGV4dA0KDQp3b3Jkc19tZWRpYV9jb21tdW5pdGllcyA8LSANCiAgVGV4dENvbW11bml0aWVzKHdvcmRzX21lZGlhX3RleHRfbmV0d29yaykNCg0KIyBJbnRlcnByZXQgdGV4dCBhbmQgaWRlbnRpZnkgMTAgaGlnaGVzdCBURklERiBmcmVxdWVuY2llcyB3aXRoaW4gZWFjaCBjbHVzdGVyDQoNCndvcmRzX25ldHdvcmtfdG9wX3dvcmRzX21vZHVsYXJpdHlfY2xhc3NlcyA8LSANCiAgSW50ZXJwcmV0VGV4dCh3b3Jkc19tZWRpYV90ZXh0X25ldHdvcmssIHdvcmRfcHJlcHBlZF9tZWRpYV90ZXh0KQ0KDQojIENhbGN1bGF0ZSBjdWx0dXJhbCBiZXR3ZWVubmVzcyBvciB0ZXh0IGNlbnRyYWxpdHkNCg0Kd29yZHNfdGV4dF9jZW50cmFsaXR5IDwtIA0KICBUZXh0Q2VudHJhbGl0eSh3b3Jkc19tZWRpYV90ZXh0X25ldHdvcmspDQpgYGANCg0KSW4gdGhlIHdvcmQtYmFzZWQgdGV4dCBuZXR3b3JrLCB0aGVyZSBoYXMgYmVlbiBzaXggY2x1c3RlcnMgb3IgY29tbXVuaXRpZXMgaWRlbnRpZmllZC4gVGhlIGxhdGVudCB0aGVtZSB3aXRoaW4gdGhlIHBpbmsgY2x1c3RlciBpcyB0aGUgcmVwb3J0aW5nIGJ5IFNBQkMgTmV3cyBvbiBDT1ZJRC0xOS4gVGhlIGxhdGVudCB0aGVtZSB3aXRoaW4gdGhlIGJsYWNrIGNsdXN0ZXIgZm9jdXNlcyBvbiBCaGVraXNpc2EncyByZXBvcnRpbmcuIFRoZSByZWQgY2x1c3RlciBmb2N1c2VzIG9uIHRoZSBBTkMuICBUaGUgY3lhbiAoYnJpZ2h0IGxpZ2h0IGJsdWUpIGNsdXN0ZXIgZm9jdXNlcyBvbiBDT1ZJRC0xOSB2YWNjaW5hdGlvbnMuIFRoZSBncmVlbiBjbHVzdGVyIGZvY3VzZXMgb24gQ09WSUQtMTkgIGNhc2VzIGFuZCBob3NwaXRhbGl6YXRpb25zLiBUaGUgYmx1ZSBjbHVzdGVyIGZvY3VzZXMgb24gQ09WSUQtMTkgY2FzZSwgcmVjb3ZlcnksIGRlYXRoIGFuZCBvdGhlciBhc3NvY2lhdGVkIGRhdGEuIFRoZXJlIGlzIGEgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBjeWFuLCBncmVlbiBhbmQgYmx1ZSBjbHVzdGVycyBpbmRpY2F0aW5nIHN0cm9uZyBzaW1pbGFyaXR5IGluIHdvcmRzIHVzZWQgdG8gY29udmV5IHNpbWlsYXIgdGhlbWVzLiAgIA0KDQojIFRoZSBTZW50aW1lbnQgb2YgdGhpcyByZXBvcnRpbmc6DQoNCg0KU2VudGltZW50IGFuYWx5c2lzIGlzIHRoZSBwcm9jZXNzIHdpdGggd2hpY2ggb25lIHRyaWVzIHRvIGlkZW50aWZ5IGFuZCBjbGFzc2lmeSB0aGUgdW5kZXJseWluZyBlbW90aW9ucyBkcmF3biBmcm9tIGEgcGllY2Ugb2YgdGV4dC5UaGUgdmlzdWFsaXNhdGlvbnMgYW5kIGRlc2NyaXB0aW9ucyBiZWxvdyB3ZXJlIGRvY3VtZW50ZWQgdXNpbmcgdGhlIOKAmGJpbmfigJkgbGV4aWNvbiwgYSB0ZXh0LWJhc2VkIGRpY3Rpb25hcnksIHdoaWNoIHRyYW5zY3JpYmVzIGFuZCBjYXRlZ29yaXNlcyB0ZXJtcyBpbiBhIGJpbmFyeSBmYXNoaW9uLiBBIHBsb3QgY29udGFpbmluZyB0aGUgYXZlcmFnZSBzZW50aW1lbnQgb2YgZWFjaCBvZiB0aGUgNiBtZWRpYSBzb3VyY2VzIHdlcmUgY2hvc2VuIHRvIGVuYWJsZSBhIGhvbGlzdGljIHBlcnNwZWN0aXZlIG9uIHRoZSBkYXRhLiBJbiB2aWV3aW5nIHRoZXNlIHNlbnRpbWVudCB2aXN1YWxpc2F0aW9ucywgdGhlIGRpZmZlcmVuY2UgaW4gZ292ZXJubWVudCBtZWRpYSBzb3VyY2VzIHRvIHRoYXQgb2YgcHJpdmF0ZSBtZWRpYSBhZ2VuY2llcyBiZWNvbWUgYXBwYXJlbnQuIEdvdmVybm1lbnQgc291cmNlcywgbGlrZSBIZWFsdGhaQSAoVGhlIFNvdXRoIEFmcmljYW4gRGVwYXJ0bWVudCBvZiBIZWFsdGgpIGFuZCBvdGhlcnMsIHBvc3QgdHdlZXRzIHJlZmxlY3RpbmcgdGhhdCBvZiBhIG1vcmUgbmV1dHJhbCB0byBwb3NpdGl2ZSBzdGFuY2UsIHdoZXJlYXMgcHJpdmF0ZSBtZWRpYSBhZ2VuY2llcyBwb3N0IHR3ZWV0cyB0aHJvdWdob3V0IHRoZSBzZW50aW1lbnQgc3BlY3RydW0uIA0KDQojIFNlbnRpbWVudCBBbmFseXNpcw0KDQpgYGB7ciBCaGVraXNpc2EgU2VudGltZW50IEFuYWx5c2lzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojc2VsZWN0DQpiaGVraXNpc2Ffc2VudCA8LQ0KICBiaGVraXNpc2FfdHdlZXRzICU+JQ0KICBzZWxlY3QoInNjcmVlbl9uYW1lIiwgInRleHQiKQ0KDQojbWFudWFsIHJlbW92YWwgb2YgaHR0cCBlbGVtZW50cw0KYmhla2lzaXNhX3NlbnQkc3RyaXBwZWRfdGV4dCA8LSBnc3ViKCJodHRwXFxTKyIsICIiLGJoZWtpc2lzYV9zZW50JHRleHQpDQoNCiN1bm5lc3RfdG9rZW5zIHRvIGNvbnZlcnQgdG8gbG93ZXIgY2FzZSArIHJlbW92ZSBwdW5jdHVhdGlvbiArIGFkZCBpbmRpdiB0d2VldCBJRA0KYmhla2lzaXNhX3NlbnRfc3RlbSA8LSANCiAgYmhla2lzaXNhX3NlbnQgJT4lDQogIHNlbGVjdChzdHJpcHBlZF90ZXh0KSAlPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBzdHJpcHBlZF90ZXh0KQ0KDQojcmVtb3ZlIHN0b3Agd29yZHMNCmNsZWFuZWRfYmhla2lzaXNhX3NlbnQgPC0gIA0KICBiaGVraXNpc2Ffc2VudF9zdGVtICU+JQ0KICBhbnRpX2pvaW4oc3RvcF93b3JkcykNCg0KI2Jpbmcgc2VudGltZW50IGFuYWx5c2lzIG9uIEJoZWtpc2lzYSB0d2VldHMNCmJpbmdfYmhla2lzaXNhIDwtIA0KICBjbGVhbmVkX2JoZWtpc2lzYV9zZW50ICU+JQ0KICBpbm5lcl9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JQ0KICBjb3VudCh3b3JkLCBzZW50aW1lbnQsIHNvcnQgPVRSVUUpJT4lDQogIHVuZ3JvdXAoKQ0KICANCiNQbG90DQpiaW5nX2JoZWtpc2lzYSAlPiUNCiAgZ3JvdXBfYnkoc2VudGltZW50KSAlPiUNCiAgdG9wX24oMTApICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lDQogIGdncGxvdChhZXMod29yZCwgbiwgZmlsbCA9IHNlbnRpbWVudCkpICsNCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIGxhYnModGl0bGUgPSAiVHdlZXRzIG9mIEJoZWtpc2lzYSIsDQogICAgICAgeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gTlVMTCkgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9oYygpDQpgYGANCuKAmHZpcnVz4oCZLCDigJhpbmZlY3RlZOKAmSwg4oCYZXBpZGVtaWPigJkgYXJlIGFtb25nIHRoZSB0b3AgZml2ZSBtb3N0IG5lZ2F0aXZlIHdvcmRzLiDigJhicmVha+KAmSBhbmQg4oCYYnJlYWtz4oCZIGFyZSBhbW9uZyB0aGUgb3RoZXIgdG9wIGZpdmUgd29yZHMsIGFuIGluZGljYXRpb24gb2YgdGhlIHRlcm0g4oCYb3V0YnJlYWvigJkv4oCZb3V0YnJlYWtz4oCZIGJlaW5nIHVzZWQgZnJlcXVlbnRseS4g4oCYc2V2ZXJl4oCZLCDigJhmZXZlcuKAmSBhbmQg4oCYcmlza+KAmSBhcmUgYW1vbmcgdGhlIHRvcCB0ZW4gbmVnYXRpdmUgd29yZHMuIOKAmHByb3RlY3TigJksIOKAmHN1cHBvcnTigJkgYW5kIOKAmGVmZmVjdGl2ZeKAmSBhcmUgdGhlIHRvcCBmb3VyIG1vc3QgcG9zaXRpdmUgd29yZHMgd2l0aCDigJhmcmVl4oCZIGJlaW5nIHRoZSB0b3AgcmFua2VkIHBvc2l0aXZlIHNlbnRpbWVudCB3b3JkLiANCg0KYGBge3IgTklDRFNlbnRpbWVudCBBbmFseXNpcywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KI3NlbGVjdA0KbmljZF9zZW50IDwtIA0KICBuaWNkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJzY3JlZW5fbmFtZSIsICJ0ZXh0IikNCg0KI21hbnVhbCByZW1vdmFsIG9mIGh0dHAgZWxlbWVudHMNCm5pY2Rfc2VudCRzdHJpcHBlZF90ZXh0IDwtDQogIGdzdWIoImh0dHBcXFMrIiwgIiIsbmljZF9zZW50JHRleHQpDQoNCiN1bm5lc3RfdG9rZW5zIHRvIGNvbnZlcnQgdG8gbG93ZXIgY2FzZSArIHJlbW92ZSBwdW5jdHVhdGlvbiArIGFkZCBpbmRpdiB0d2VldCBJRA0KbmljZF9zZW50X3N0ZW0gPC0gDQogIG5pY2Rfc2VudCAlPiUNCiAgc2VsZWN0KHN0cmlwcGVkX3RleHQpICU+JQ0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHN0cmlwcGVkX3RleHQpDQoNCiNyZW1vdmUgc3RvcCB3b3Jkcw0KY2xlYW5lZF9uaWNkX3NlbnQgPC0NCiAgbmljZF9zZW50X3N0ZW0gJT4lDQogIGFudGlfam9pbihzdG9wX3dvcmRzKQ0KDQojYmluZyBzZW50aW1lbnQgYW5hbHlzaXMgb24gTklDRCB0d2VldHMNCmJpbmdfbmljZCA8LSANCiAgY2xlYW5lZF9uaWNkX3NlbnQgJT4lDQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoImJpbmciKSkgJT4lDQogIGNvdW50KHdvcmQsIHNlbnRpbWVudCwgc29ydCA9VFJVRSklPiUNCiAgdW5ncm91cCgpDQoNCiNQbG90DQpiaW5nX25pY2QgJT4lDQogIGdyb3VwX2J5KHNlbnRpbWVudCkgJT4lDQogIHRvcF9uKDEwKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIG4sIGZpbGwgPSBzZW50aW1lbnQpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJUd2VldHMgb2YgTklDRCIsDQogICAgICAgeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gIiIpICsNCiAgY29vcmRfZmxpcCgpKw0KICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lX2hjKCkNCmBgYA0KVGhlIHRvcCB0ZW4gbmVnYXRpdmUgd29yZHMgaW4gTklDRCB0d2VldHMgY291bGQgYmUgY2F0ZWdvcmlzZWQgYXMgYmVpbmcgaW4gcmVsYXRpb24gdG8gdGhlIGNvcm9uYXZpcnVzLiBBbW9uZyB0aGVzZSBuZWdhdGl2ZSB3b3JkcyBhcmUg4oCYc3ltcHRvbXPigJksIOKAmHJpc2vigJksIOKAmHZpcnVz4oCZLCDigJhzaWNr4oCZLCDigJhpbmZlY3Rpb27igJksIOKAmGlsbG5lc3PigJkgYW5kIOKAmGluZmVjdGlvbnPigJkuIFRoZSB0b3AgMTAgbW9zdCBwb3NpdGl2ZSB3b3JkcyBhcmUg4oCYc2FmZeKAmSwg4oCYcHJvdGVjdGl2ZeKAmSwg4oCYcHJvdGVjdOKAmSwg4oCYc21hcnTigJksIOKAmHJlZ2FyZOKAmSwg4oCYbG92ZWTigJksIOKAmGNvcnJlY3TigJksIOKAmHJlY292ZXJ54oCZLCDigJhyZWFkeeKAmSBhbmQg4oCYZW5jb3VyYWdl4oCZLg0KDQpgYGB7ciBEZXBhcnRtZW50IG9mIEhlYWx0aCAoQEhlYWx0aFpBKSBTZW50aW1lbnQgQW5hbHlzaXMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCiNTZWxlY3QNCmhlYWx0aHphX3NlbnQgPC0gDQogIGhlYWx0aHphX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJzY3JlZW5fbmFtZSIsICJ0ZXh0IikNCg0KI21hbnVhbCByZW1vdmFsIG9mIGh0dHAgZWxlbWVudHMNCmhlYWx0aHphX3NlbnQkc3RyaXBwZWRfdGV4dCA8LQ0KICBnc3ViKCJodHRwXFxTKyIsICIiLGhlYWx0aHphX3NlbnQkdGV4dCkNCg0KI3VubmVzdF90b2tlbnMgdG8gY29udmVydCB0byBsb3dlciBjYXNlICsgcmVtb3ZlIHB1bmN0dWF0aW9uICsgYWRkIGluZGl2IHR3ZWV0IElEDQpoZWFsdGh6YV9zZW50X3N0ZW0gPC0NCiAgaGVhbHRoemFfc2VudCAlPiUNCiAgc2VsZWN0KHN0cmlwcGVkX3RleHQpICU+JQ0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHN0cmlwcGVkX3RleHQpDQoNCiNyZW1vdmUgc3RvcCB3b3Jkcw0KY2xlYW5lZF9oZWFsdGh6YV9zZW50IDwtIA0KICBoZWFsdGh6YV9zZW50X3N0ZW0gJT4lDQogIGFudGlfam9pbihzdG9wX3dvcmRzKQ0KDQojYmluZyBzZW50aW1lbnQgYW5hbHlzaXMgb24gSGVhbHRoWkEgdHdlZXRzDQpiaW5nX2hlYWx0aHphIDwtIA0KICBjbGVhbmVkX2hlYWx0aHphX3NlbnQgJT4lDQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoImJpbmciKSkgJT4lDQogIGNvdW50KHdvcmQsIHNlbnRpbWVudCwgc29ydCA9VFJVRSklPiUNCiAgdW5ncm91cCgpDQogIA0KI1Bsb3QNCmJpbmdfaGVhbHRoemEgJT4lDQogIGdyb3VwX2J5KHNlbnRpbWVudCkgJT4lDQogIHRvcF9uKDEwKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIG4sIGZpbGwgPSBzZW50aW1lbnQpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJUd2VldHMgb2YgU0EgRGVwYXJ0bWVudCBvZiBIZWFsdGgiLA0KICAgICAgIHkgPSAiQ29udHJpYnV0aW9uIHRvIHNlbnRpbWVudCIsDQogICAgICAgeCA9ICIiKSArDQogIGNvb3JkX2ZsaXAoKSsNCiAgZmFjZXRfd3JhcCh+c2VudGltZW50LCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICB0aGVtZV9oYygpDQpgYGANCkFzIHdpdGggdGhlIE5JQ0QgbmVnYXRpdmUgc2VudGltZW50IHZpc3VhbGlzYXRpb24sIOKAmHJlZ3JldHRhYmx54oCZIHNlZW1zIHRvIGJlIHRoZSB3b3JkIGNhcnJ5aW5nIHRoZSB0b3AgbmVnYXRpdmUgc2VudGltZW50IHdpdGhpbiBpbiB0aGVpciB0d2VldHMuIE90aGVyIHdvcmRzIGFyZSwg4oCYcmlza+KAmSwg4oCYdmlydXPigJksIOKAmGJyZWFrZG93buKAmSwg4oCYZGVhdGjigJksIOKAmHN5bXB0b21z4oCZLCDigJhpbmZlY3Rpb25z4oCZLCDigJhpc29sYXRpb27igJksIOKAmGluZmVjdGlvbuKAmSBhbmQg4oCYaW5mZWN0aW9uc+KAmS4g4oCYcHJvdGVjdOKAmSwg4oCYcmVjb3ZlcnnigJksIOKAmGxvdmVk4oCZIGFyZSB0aGUgdG9wIHRocmVlIG1vc3QgcG9zaXRpdmUgd29yZHMsIGZvbGxvd2VkIGJ5IOKAmHBvc2l0aXZl4oCZLCDigJhzYWZl4oCZLCDigJhmZXN0aXZl4oCZLCDigJhzdXBwb3J04oCZLCDigJhwYXRpZW504oCZLCDigJhmcmVl4oCZIGFuZCDigJhjbGVhbuKAmS4NCg0KYGBge3IgTmV3czI0IFNlbnRpbWVudCBBbmFseXNpcywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KI3NlbGVjdA0KbmV3czI0X3NlbnQgPC0NCiAgbmV3czI0X3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJzY3JlZW5fbmFtZSIsICJ0ZXh0IikNCg0KI3JlbW92YWwgb2YgaHR0cCBlbGVtZW50cw0KbmV3czI0X3NlbnQkc3RyaXBwZWRfdGV4dCA8LSANCiAgZ3N1YigiaHR0cFxcUysiLCAiIixuZXdzMjRfc2VudCR0ZXh0KQ0KDQojdW5uZXN0X3Rva2VucyB0byBjb252ZXJ0IHRvIGxvd2VyIGNhc2UgKyByZW1vdmUgcHVuYyArIGFkZCBpbmRpdiB0d2VldCBJRA0KbmV3czI0X3NlbnRfc3RlbSA8LSANCiAgbmV3czI0X3NlbnQgJT4lDQogIHNlbGVjdChzdHJpcHBlZF90ZXh0KSAlPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBzdHJpcHBlZF90ZXh0KQ0KDQojcmVtb3ZlIHN0b3Agd29yZHMNCmNsZWFuZWRfbmV3czI0X3NlbnQgPC0NCiAgbmV3czI0X3NlbnRfc3RlbSAlPiUNCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpDQoNCiNiaW5nIHNlbnRpbWVudCBhbmFseXNpcyBvbiBOZXdzMjQgdHdlZXRzDQpiaW5nX25ld3MyNCA8LSANCiAgY2xlYW5lZF9uZXdzMjRfc2VudCAlPiUNCiAgaW5uZXJfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUNCiAgY291bnQod29yZCwgc2VudGltZW50LCBzb3J0ID1UUlVFKSU+JQ0KICB1bmdyb3VwKCkNCiAgDQojUGxvdA0KYmluZ19uZXdzMjQgJT4lDQogIGdyb3VwX2J5KHNlbnRpbWVudCkgJT4lDQogIHRvcF9uKDEwKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIG4sIGZpbGwgPSBzZW50aW1lbnQpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJUd2VldHMgb2YgTkVXUzI0ICIsDQogICAgICAgeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gIiIpICsNCiAgY29vcmRfZmxpcCgpKw0KICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lX2hjKCkNCmBgYA0K4oCYaW5mZWN0aW9uc+KAmSwg4oCYZGVhdGjigJkgYW5kIOKAmHByaXNvbuKAmSBhcmUgYW1vbmcgdGhlIHRvcCB0aHJlZSBtb3N0IG5lZ2F0aXZlIHdvcmRzLiDigJhzdXBwb3J04oCZLCDigJh0b3DigJkgYW5kIOKAmHBvc2l0aXZl4oCZIGFyZSBhbW9uZyB0aGUgdG9wIHRocmVlIG1vc3QgcG9zaXRpdmUgTmV3czI0IHdvcmRzLiBPdGhlciB0aGFuIHRoYXQsIHRoZXJlIGFyZSBubyBvdGhlciBDb3ZpZC0xOSByZWxhdGVkIHdvcmRzLiANCg0KYGBge3IgSGVhbHRoMjQgU2VudGltZW50IEFuYWx5c2lzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojc2VsZWN0DQpIZWFsdGgyNF9zZW50IDwtIA0KICBoZWFsdGgyNF90aW1lbGluZV9kZiAgJT4lDQogIHNlbGVjdCgic2NyZWVuX25hbWUiLCAidGV4dCIpDQoNCiNtYW51YWwgcmVtb3ZhbCBvZiBodHRwIGVsZW1lbnRzDQpIZWFsdGgyNF9zZW50JHN0cmlwcGVkX3RleHQgPC0gDQogIGdzdWIoImh0dHBcXFMrIiwgIiIsSGVhbHRoMjRfc2VudCR0ZXh0KQ0KDQojdW5uZXN0X3Rva2VucyB0byBjb252ZXJ0IHRvIGxvd2VyIGNhc2UgKyByZW1vdmUgcHVuY3R1YXRpb24gKyBhZGQgaW5kaXYgdHdlZXQgSUQNCkhlYWx0aDI0X3NlbnRfc3RlbSA8LSANCiAgSGVhbHRoMjRfc2VudCAlPiUNCiAgc2VsZWN0KHN0cmlwcGVkX3RleHQpICU+JQ0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHN0cmlwcGVkX3RleHQpDQoNCiNyZW1vdmUgc3RvcCB3b3Jkcw0KY2xlYW5lZF9IZWFsdGgyNF9zZW50IDwtDQogIEhlYWx0aDI0X3NlbnRfc3RlbSAlPiUNCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpDQoNCiNiaW5nIHNlbnRpbWVudCBhbmFseXNpcyBvbiBIZWFsdGgyNHR3ZWV0cw0KYmluZ19IZWFsdGgyNCA8LSANCiAgY2xlYW5lZF9IZWFsdGgyNF9zZW50ICU+JQ0KICBpbm5lcl9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JQ0KICBjb3VudCh3b3JkLCBzZW50aW1lbnQsIHNvcnQgPVRSVUUpJT4lDQogIHVuZ3JvdXAoKQ0KIA0KI1Bsb3QgDQpiaW5nX0hlYWx0aDI0ICU+JQ0KICBncm91cF9ieShzZW50aW1lbnQpICU+JQ0KICB0b3BfbigxMCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgbXV0YXRlKHdvcmQgPSByZW9yZGVyKHdvcmQsIG4pKSAlPiUNCiAgZ2dwbG90KGFlcyh3b3JkLCBuLCBmaWxsID0gc2VudGltZW50KSkgKw0KICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGxhYnModGl0bGUgPSAiVHdlZXRzIG9mIEhlYWx0aDI0ICIsDQogICAgICAgeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gIiIpICsNCiAgY29vcmRfZmxpcCgpKw0KICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lX2hjKCkNCmBgYA0KVGhlIHRvcCBuZWdhdGl2ZSB3b3JkcyBmcm9tIHRoZSBIZWFsdGgyNCB0d2l0dGVyIGhhbmRsZSBhcmUg4oCYcmlza+KAmSwg4oCYY2FuY2Vy4oCZLCDigJhzeW1wdG9tc+KAmSwg4oCYbG9zc+KAmSwg4oCYc3VmZmVy4oCZLCDigJhsb3Nl4oCZLCDigJhzdHJlc3PigJksIOKAmGFsbGVyZ2llc+KAmSwg4oCYcGFpbuKAmSBhbmQg4oCYaW5mZWN0aW9u4oCZLiBUaGUgdG9wIHBvc2l0aXZlIHdvcmRzIGZyb20gSGVhbHRoMjQgYXJlIOKAmGZhbnPigJksIOKAmGhlYWx0aHnigJksIOKAmHdpbuKAmSwg4oCYYmVuZWZpdHPigJksIOKAmHByb3RlY3TigJksIOKAmGJvb3N04oCZLCDigJhzYWZl4oCZLCDigJhpbXByb3Zl4oCZLCDigJh0b3DigJkgYW5kIOKAmGVhc3nigJkuIFRoZSBncmVhdCBtYWpvcml0eSBvZiB0aGVzZSB3b3JkcyBhcmUgaGVhbHRoIHJlbGF0ZWQuIA0KDQoNCmBgYHtyIGVOQ0EgU2VudGltZW50IEFuYWx5c2lzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojc2VsZWN0DQplbmNhX3NlbnQgPC0gZW5jYV90aW1lbGluZV9kZiAgJT4lDQogIHNlbGVjdCgic2NyZWVuX25hbWUiLCAidGV4dCIpDQoNCiNtYW51YWwgcmVtb3ZhbCBvZiBodHRwIGVsZW1lbnRzDQplbmNhX3NlbnQkc3RyaXBwZWRfdGV4dCA8LSANCiAgZ3N1YigiaHR0cFxcUysiLCAiIixlbmNhX3NlbnQkdGV4dCkNCg0KI3VubmVzdF90b2tlbnMgdG8gY29udmVydCB0byBsb3dlciBjYXNlICsgcmVtb3ZlIHB1bmN0dWF0aW9uICsgYWRkIGluZGl2IHR3ZWV0IElEDQplbmNhX3NlbnRfc3RlbSA8LSANCiAgZW5jYV9zZW50ICU+JQ0KICBzZWxlY3Qoc3RyaXBwZWRfdGV4dCkgJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgc3RyaXBwZWRfdGV4dCkNCg0KI3JlbW92ZSBzdG9wIHdvcmRzDQpjbGVhbmVkX2VuY2Ffc2VudCA8LQ0KICBlbmNhX3NlbnRfc3RlbSAlPiUNCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpDQoNCiNiaW5nIHNlbnRpbWVudCBhbmFseXNpcyBvbiBlTkNBIHR3ZWV0cw0KYmluZ19lbmNhIDwtDQogIGNsZWFuZWRfZW5jYV9zZW50ICU+JQ0KICBpbm5lcl9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JQ0KICBjb3VudCh3b3JkLCBzZW50aW1lbnQsIHNvcnQgPVRSVUUpJT4lDQogIHVuZ3JvdXAoKQ0KICANCiNQbG90DQpiaW5nX2VuY2EgJT4lDQogIGdyb3VwX2J5KHNlbnRpbWVudCkgJT4lDQogIHRvcF9uKDEwKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIG4sIGZpbGwgPSBzZW50aW1lbnQpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJUd2VldHMgb2YgZU5DQSIsDQogICAgICAgeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gIiIpICsNCiAgY29vcmRfZmxpcCgpKw0KICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lX2hjKCkNCmBgYA0K4oCYYnJlYWtpbmfigJkgaXMgdGhlIG1vc3QgbmVnYXRpdmUgd29yZCB3aXRoaW4gdGhlIGVOQ0EgdHdlZXRzLiDigJhpbmZlY3Rpb25z4oCZLCDigJh2aXJ1c+KAmSBhbmQg4oCYZGVhdGjigJkgYXJlIGFtb25nIHRoZSB0b3AgMTAgbW9zdCBuZWdhdGl2ZSB3b3Jkcy4g4oCYc3VwcG9ydOKAmSDigJhob3TigJkg4oCYZnJlZeKAmSDigJh0b3DigJkg4oCYcHJlbWllcuKAmSDigJhyZWFkeeKAmSDigJh2YWx1YWJsZeKAmSDigJhsZWTigJkg4oCYZGVkaWNhdGVk4oCZIGFuZCDigJhib29zdOKAmSBhcmUgdGhlIHRlbiBtb3N0IHBvc2l0aXZlIHdvcmRzLiANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KDQojU0VMRUNUSU9OIE9GIEFMTCBNRURJQSBTT1VSQ0VTIFdJVEggU0VOVElNRU5UDQpCaGVrX2JpbmcgPC0NCiAgdGlkeV9iaGVraXNpc2FfdHdlZXRzICU+JQ0KICBsZWZ0X2pvaW4oZ2V0X3NlbnRpbWVudHMoImJpbmciKSkgJT4lIA0KICBjb3VudChzZW50aW1lbnQpICU+JSANCiAgc3ByZWFkKHNlbnRpbWVudCwgbiwgZmlsbCA9IDApICU+JSANCiAgbXV0YXRlKHNlbnRpbWVudCA9IHBvc2l0aXZlIC0gbmVnYXRpdmUpIA0KDQpuaWNkX2JpbmcgPC0gDQogIHRpZHlfbmljZF90d2VldHMgJT4lDQogIGxlZnRfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUgDQogIGNvdW50KHNlbnRpbWVudCkgJT4lIA0KICBzcHJlYWQoc2VudGltZW50LCBuLCBmaWxsID0gMCkgJT4lIA0KICBtdXRhdGUoc2VudGltZW50ID0gcG9zaXRpdmUgLSBuZWdhdGl2ZSkNCg0KaGVhbHRoemFfYmluZyA8LQ0KICB0aWR5X2hlYWx0aHphX3R3ZWV0cyAlPiUNCiAgbGVmdF9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JSANCiAgY291bnQoc2VudGltZW50KSAlPiUgDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKQ0KDQpld25fYmluZyA8LSANCiAgdGlkeV9ld25yZXBvcnRlcl90d2VldHMgJT4lDQogIGxlZnRfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUgDQogIGNvdW50KHNlbnRpbWVudCkgJT4lIA0KICBzcHJlYWQoc2VudGltZW50LCBuLCBmaWxsID0gMCkgJT4lIA0KICBtdXRhdGUoc2VudGltZW50ID0gcG9zaXRpdmUgLSBuZWdhdGl2ZSkgDQoNCm5ld3MyNF9iaW5nIDwtDQogIHRpZHlfbmV3czI0X3R3ZWV0cyAlPiUNCiAgbGVmdF9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JSANCiAgY291bnQoc2VudGltZW50KSAlPiUgDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKSANCg0KR292ZXJubWVudFpBX2JpbmcgPC0gDQogIHRpZHlfR292ZXJubWVudFpBX3R3ZWV0cyAlPiUNCiAgbGVmdF9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JSANCiAgY291bnQoc2VudGltZW50KSAlPiUgDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKSANCg0KaGVhbHRoMjRfYmluZyA8LSANCiAgdGlkeV9oZWFsdGgyNF90d2VldHMgJT4lDQogIGxlZnRfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUgDQogIGNvdW50KHNlbnRpbWVudCkgJT4lIA0KICBzcHJlYWQoc2VudGltZW50LCBuLCBmaWxsID0gMCkgJT4lIA0KICBtdXRhdGUoc2VudGltZW50ID0gcG9zaXRpdmUgLSBuZWdhdGl2ZSkgDQoNClNBZ292bmV3c19iaW5nIDwtIA0KICB0aWR5X1NBZ292bmV3c190d2VldHMgJT4lDQogIGxlZnRfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUgDQogIGNvdW50KHNlbnRpbWVudCkgJT4lIA0KICBzcHJlYWQoc2VudGltZW50LCBuLCBmaWxsID0gMCkgJT4lIA0KICBtdXRhdGUoc2VudGltZW50ID0gcG9zaXRpdmUgLSBuZWdhdGl2ZSkgDQoNCnNhYmNfYmluZyA8LSANCiAgdGlkeV9zYWJjX3R3ZWV0cyAlPiUNCiAgbGVmdF9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JSANCiAgY291bnQoc2VudGltZW50KSAlPiUgDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKSAgDQoNCmVuY2FfYmluZyA8LSANCiAgdGlkeV9lbmNhX3R3ZWV0cyAlPiUNCiAgbGVmdF9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JSANCiAgY291bnQoc2VudGltZW50KSAlPiUgDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKSANCg0KI0FERElUSU9OIE9GIElEIEFORCBUL0YgVkFMVUUNCm5hbWUgPC0gYygnQmhla2lzaXNhJykNCmtsZXVyIDwtIGMoRkFMU0UpDQpCaGVrX2JpbmcgPC1jYmluZChuYW1lLEJoZWtfYmluZywga2xldXIpDQoNCm5hbWUgPC0gYygnTklDRCcpDQprbGV1ciA8LSBjKFRSVUUpDQpuaWNkX2JpbmcgPC1jYmluZChuYW1lLG5pY2RfYmluZywga2xldXIpDQoNCm5hbWUgPC0gYygnSGVhbHRoWkEnKQ0Ka2xldXIgPC0gYyhUUlVFKQ0KaGVhbHRoemFfYmluZyA8LWNiaW5kKG5hbWUsaGVhbHRoemFfYmluZywga2xldXIpDQoNCm5hbWUgPC0gYygnRVdOcmVwb3J0ZXInKQ0Ka2xldXIgPC0gYyhGQUxTRSkNCmV3bl9iaW5nIDwtY2JpbmQobmFtZSxld25fYmluZywga2xldXIpDQoNCm5hbWUgPC0gYygnTmV3czI0JykNCmtsZXVyIDwtIGMoRkFMU0UpDQpuZXdzMjRfYmluZyA8LWNiaW5kKG5hbWUsbmV3czI0X2JpbmcsIGtsZXVyKQ0KDQpuYW1lIDwtIGMoJ0dvdmVybm1lbnRaQScpDQprbGV1ciA8LSBjKFRSVUUpDQpHb3Zlcm5tZW50WkFfYmluZyA8LWNiaW5kKG5hbWUsR292ZXJubWVudFpBX2JpbmcsIGtsZXVyKQ0KDQpuYW1lIDwtIGMoJ0hlYWx0aDI0JykNCmtsZXVyIDwtIGMoRkFMU0UpDQpoZWFsdGgyNF9iaW5nIDwtY2JpbmQobmFtZSxoZWFsdGgyNF9iaW5nLCBrbGV1cikNCg0KbmFtZSA8LSBjKCdTQWdvdm5ld3MnKQ0Ka2xldXIgPC0gYyhUUlVFKQ0KU0Fnb3ZuZXdzX2JpbmcgPC1jYmluZChuYW1lLFNBZ292bmV3c19iaW5nLCBrbGV1cikNCg0KbmFtZSA8LSBjKCdTQUJDJykNCmtsZXVyIDwtIGMoRkFMU0UpDQpzYWJjX2JpbmcgPC1jYmluZChuYW1lLHNhYmNfYmluZywga2xldXIpDQoNCm5hbWUgPC0gYygnZU5DQScpDQprbGV1ciA8LSBjKEZBTFNFKQ0KZW5jYV9iaW5nIDwtY2JpbmQobmFtZSxlbmNhX2JpbmcsIGtsZXVyKQ0KDQoNCiNDb21iaW5hdGlvbiBvZiBBbGwgTWVkaWEgU291cmNlcyBEZXNjcmliZWQgQWJvdmUNCmFsbF9iaW5nX2RmIDwtDQogIGJpbmRfcm93cyhCaGVrX2JpbmcsaGVhbHRoemFfYmluZyxuaWNkX2JpbmcsZXduX2JpbmcsbmV3czI0X2JpbmcsIA0KICAgICAgICAgICAgR292ZXJubWVudFpBX2JpbmcsIGhlYWx0aDI0X2JpbmcsIHNhYmNfYmluZywgZW5jYV9iaW5nLCBTQWdvdm5ld3NfYmluZykNCg0KI1Bsb3QNCmdncGxvdChhbGxfYmluZ19kZiwgYWVzKHggPSBuYW1lLCB5ID0gc2VudGltZW50LCBmaWxsID0ga2xldXIpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImlkZW50aXR5Iiwgc2l6ZSA9IDAuMjUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI0ZGNTcyMiIsICIjMDBBREI1IiksIA0KICAgICAgICAgICAgICAgICAgICBndWlkZSA9IEZBTFNFKSArIA0KICB0aGVtZV9oYygpICsNCiAgeGxhYihOVUxMKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGUgPSAiT3ZlcmFsbCBTZW50aW1lbnQgb2YgZWFjaCBNZWRpYSBTb3VyY2UiLCBjYXB0aW9uID0gIlVwZGF0ZWQ6IEp1bHkgMjAyMSIpDQpgYGANCkEgY29uY2x1c2lvbiBjYW4gYmUgbWFkZSB0aGF0IGdvdmVybm1lbnQgYWdlbmNpZXMgYWltIHRvIGltcG9zZSBlbW90aW9ucyBvZiBhIG1vcmUgdHJhbnF1aWwvcG9zaXRpdmUgbmF0dXJlLCBpbiBvcHBvc2l0aW9uIHRvIHByaXZhdGUgYWdlbmNpZXMgd2hvIHNvbGVseSB3YW50IHRvIGludm9rZSBhbiBlbW90aW9uIG9uIGFueSBzaWRlcyBvZiB0aGUgc2VudGltZW50IHNwZWN0cnVtLCBiZWluZyB0aGF0IG91dHJpZ2h0IG5lZ2F0aXZlIG9yIG91dHJpZ2h0IHBvc2l0aXZlLiANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KbWVkaWFfc2VudCA8LSANCiAgY29tcGxldGVfZGF0YV9zb3VyY2VfZGYgJT4lDQogIHNlbGVjdCgic2NyZWVuX25hbWUiLCAidGV4dCIpDQoNCiNtYW51YWwgcmVtb3ZhbCBvZiBodHRwIGVsZW1lbnRzDQptZWRpYV9zZW50JHN0cmlwcGVkX3RleHQgPC0gDQogIGdzdWIoImh0dHBcXFMrIiwgIiIsbWVkaWFfc2VudCR0ZXh0KQ0KDQojdW5uZXN0X3Rva2VucyB0byBjb252ZXJ0IHRvIGxvd2VyIGNhc2UgKyByZW1vdmUgcHVuY3R1YXRpb24gKyBhZGQgaW5kaXYgdHdlZXQgSUQNCm1lZGlhX3NlbnRfc3RlbSA8LSANCiAgbWVkaWFfc2VudCAlPiUNCiAgc2VsZWN0KHN0cmlwcGVkX3RleHQpICU+JQ0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHN0cmlwcGVkX3RleHQpDQoNCiNyZW1vdmUgc3RvcCB3b3Jkcw0KY2xlYW5lZF9tZWRpYV9zZW50IDwtICANCiAgbWVkaWFfc2VudF9zdGVtICU+JQ0KICBhbnRpX2pvaW4oc3RvcF93b3JkcykNCg0KI2Jpbmcgc2VudGltZW50IGFuYWx5c2lzIG9uIHR3ZWV0cw0KYmluZ19tZWRpYSA8LSBjbGVhbmVkX21lZGlhX3NlbnQgJT4lDQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoImJpbmciKSkgJT4lDQogIGNvdW50KHdvcmQsIHNlbnRpbWVudCwgc29ydCA9VFJVRSklPiUNCiAgdW5ncm91cCgpDQogIA0KI1Bsb3QNCmJpbmdfbWVkaWEgJT4lDQogIGdyb3VwX2J5KHNlbnRpbWVudCkgJT4lDQogIHRvcF9uKDEwKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIG4sIGZpbGwgPSBzZW50aW1lbnQpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgZmFjZXRfd3JhcCh+c2VudGltZW50LCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICBsYWJzKHRpdGxlID0gIlR3ZWV0cyBvZiBBbGwgTWVkaWEgU291cmNlcyIsDQogICAgICAgeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gTlVMTCwgY2FwdGlvbiA9ICJVcGRhdGVkOiBKdWx5IDIwMjEiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX2hjKCkNCg0KDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmNvbXBsZXRlX2RhdGFfc291cmNlX2RmMiA8LQ0KICBiaGVraXNpc2FfdHdlZXRzICU+JQ0KICBmdWxsX2pvaW4oaGVhbHRoemFfdHdlZXRzKSAlPiUNCiAgZnVsbF9qb2luKG5ld3MyNF90d2VldHMpICU+JQ0KICBmdWxsX2pvaW4obmljZF90d2VldHMpICU+JQ0KICBmdWxsX2pvaW4oZW5jYV90aW1lbGluZV9kZikgJT4lDQogIGZ1bGxfam9pbihoZWFsdGgyNF90aW1lbGluZV9kZikNCg0KdmFjY2luZV90d2VldHMgPC0NCiAgZHBseXI6OmZpbHRlcihjb21wbGV0ZV9kYXRhX3NvdXJjZV9kZjIsIGdyZXBsKCd2YWNjaW5lJywgdGV4dCkpDQoNCnZhY2NpbmVfdGV4dCA8LSB2YWNjaW5lX3R3ZWV0cyR0ZXh0DQoNCnZhY2NpbmVfY29ycCA8LSBDb3JwdXMoVmVjdG9yU291cmNlKHZhY2NpbmVfdGV4dCkpDQoNCnR3aXR0ZXJIYW5kbGVSZW1vdmVyIDwtIGZ1bmN0aW9uKHgpIGdzdWIoIkBcXFMrIiwiIiwgeCkNCg0KaGFzaHRhZ1JlbW92ZXIgPC0gZnVuY3Rpb24oeCkgZ3N1YigiI1xcUysiLCIiLCB4KQ0KDQplbW9qaVJlbW92ZXIgPC0gZnVuY3Rpb24oeCkgZ3N1YigiW15ceDAxLVx4NzRGXSIsIiIseCkNCg0KdG9TcGFjZSA9IGNvbnRlbnRfdHJhbnNmb3JtZXIoZnVuY3Rpb24oeCxwYXR0ZXJuKWdzdWIocGF0dGVybiwiIix4KSkNCg0KY2xlYW5lciA8LSBmdW5jdGlvbih2YWNjaW5lX2NvcnApDQogIHsNCiAgdmFjY2luZV9jb3JwIDwtIA0KICB0bV9tYXAodmFjY2luZV9jb3JwLCB0b1NwYWNlLA0KICAgICAgICAgIj8oZnxodCl0cChzPyk6Ly8oLiopWy5dW2Etel0rIikNCiAgDQogIHZhY2NpbmVfY29ycCA8LSANCiAgICB0bV9tYXAodmFjY2luZV9jb3JwLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHJhbnNmb3JtZXIodHdpdHRlckhhbmRsZVJlbW92ZXIpKQ0KICANCiAgdmFjY2luZV9jb3JwIDwtIA0KICAgIHRtX21hcCh2YWNjaW5lX2NvcnAsDQogICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90cmFuc2Zvcm1lcihoYXNodGFnUmVtb3ZlcikpDQogIA0KICB2YWNjaW5lX2NvcnAgPC0gDQogICAgdG1fbWFwKHZhY2NpbmVfY29ycCwgcmVtb3ZlUHVuY3R1YXRpb24pDQogIA0KICB2YWNjaW5lX2NvcnAgPC0gDQogICAgdG1fbWFwKHZhY2NpbmVfY29ycCwgZW1vamlSZW1vdmVyKQ0KICANCiAgdmFjY2luZV9jb3JwIDwtIA0KICAgIHRtX21hcCh2YWNjaW5lX2NvcnAsIHN0ZW1Eb2N1bWVudCkNCiAgDQogIHZhY2NpbmVfY29ycCA8LQ0KICAgIHRtX21hcCh2YWNjaW5lX2NvcnAsIGNvbnRlbnRfdHJhbnNmb3JtZXIodG9sb3dlcikpDQogIHJldHVybih2YWNjaW5lX2NvcnApDQp9DQp2YWNjaW5lX2NvcnAgPC0gDQogIGNsZWFuZXIodmFjY2luZV9jb3JwKQ0KDQpuZXdfdmFjY2luZWRmIDwtIA0KICBkYXRhLmZyYW1lKHRleHQgPSBzYXBwbHkodmFjY2luZV9jb3JwLCBhcy5jaGFyYWN0ZXIpLA0KICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCg0KbmV3X3ZhY2NpbmVkZiA8LQ0KICB1bmxpc3QobmV3X3ZhY2NpbmVkZikNCg0KDQpwYXR0ZXJuID0gIl5bWzpzcGFjZTpdXSokIg0KDQp2YWNjaW5lX2RmIDwtDQogIG5ld192YWNjaW5lZGZbZ3JlcChwYXR0ZXJuLCBuZXdfdmFjY2luZWRmLCBpbnZlcnQgPSBUUlVFKV0NCg0KI3NlbnRpbWVudCBhbmFseXNpcw0KDQpzZW50aW1lbnRzX2RmIDwtIA0KICBzZW50aW1lbnRfYXR0cmlidXRlcyh2YWNjaW5lX2RmKQ0KDQpuZXdfMiA8LSANCiAgZ2V0X3NlbnRlbmNlcyh2YWNjaW5lX2RmKQ0KDQp0d2VldF9zZW50aW1lbnQ8LQ0KICBzZW50aW1lbnRfYnkobmV3XzIsIGF2ZXJhZ2luZy5mdW5jdGlvbiA9IGF2ZXJhZ2Vfd2VpZ2h0ZWRfbWl4ZWRfc2VudGltZW50KQ0KDQojdmlzdWFsaXphdGlvbiBvZiBzZW50aW1lbnRzDQojIE1ha2UgdGhlIGdyYXBoDQp2YWNjaW5lX3NlbnRfZ3JhcGggPSBwbG90X2x5KHg9dHdlZXRfc2VudGltZW50JHdvcmRfY291bnQseT10d2VldF9zZW50aW1lbnQkYXZlX3NlbnRpbWVudCxtb2RlPSJtYXJrZXJzIixjb2xvcnMgPWMoIiNGRjU3MjIiLCIjMDBBREI1Iiksc2l6ZT1hYnModHdlZXRfc2VudGltZW50JGF2ZV9zZW50aW1lbnQpLzMgLCBjb2xvcj1pZmVsc2UodHdlZXRfc2VudGltZW50JGF2ZV9zZW50aW1lbnQ+MCwiUG9zaXRpdmUiLCJOZWdhdGl2ZSIpICkgJT4lIA0KI0NoYW5nZSBob3ZlciBtb2RlIGluIHRoZSBsYXlvdXQgYXJndW1lbnQgDQpsYXlvdXQoIGhvdmVybW9kZT0iY2xvc2VzdCIsdGl0bGU9IlNlbnRpbWVudCBhbmFseXNpcyBieSBUd2VldCIseGF4aXM9IGxpc3QodGl0bGUgPSAiTnVtYmVyIG9mIHdvcmRzIHBlciBUd2VldCIsc2l6ZT0xOCkseWF4aXMgPSBsaXN0KHRpdGxlID0gIlNlbnRpbWVudHMgYnkgVHdlZXQiLHNpemU9MTgpKQ0KIyBzaG93IHRoZSBncmFwaA0KdmFjY2luZV9zZW50X2dyYXBoDQpgYGANCg0KIyMgQ29tcGFyaXNvbiBDbG91ZCBvZiB0aGUgU2VudGltZW50IG9mIFNlbGVjdGVkIE1lZGlhIFNvdXJjZXMNCg0KYGBge3IgU2VudGltZW50X0FuYWx5c2lzX0NvbXBhcmlzb25fQ2xvdWQsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCiMgQ29tcGFyaXNvbiBDbG91ZCBvZiB0aGUgU2VudGltZW50IG9mIFNlbGVjdGVkIE1lZGlhIFNvdXJjZXMNCg0KdGlkeV9hbGxfbWVkaWFfdHdlZXRzICU+JQ0KICBpbm5lcl9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JQ0KICBjb3VudCh3b3JkLCBzZW50aW1lbnQsIHNvcnQgPSBUUlVFKSAlPiUNCiAgYWNhc3Qod29yZCB+IHNlbnRpbWVudCwgdmFsdWUudmFyID0gIm4iLCBmaWxsID0gMCkgJT4lDQogIGNvbXBhcmlzb24uY2xvdWQoY29sb3JzID0gYygiI0ZGNTcyMiIsICIjMDBBREI1IiksDQogICAgICAgICAgICAgICAgICAgbWF4LndvcmRzID0gMTAwLCBzY2FsZSA9IGMoNCwgMC41KSkNCmBgYA0KVGhlIG1vc3Qgc2lnbmlmaWNhbnQgd29yZHMgcG90cmF5ZWQgYnkgdGhpcyBhbmFseXNpcyBpcyAnc2FmZScsICdpbmZlY3Rpb25zJywgJ3dvcmsnIGFuZCAncmVjb3ZlcnknIHdoaWNoIGNhbiBhbGwgYmUgcmVsYXRlZCB0byB0aGUgQ292aWQgLTE5IGVwaWRlbWljLg0KDQojIyMgSG93IHRoZXkgZGlmZmZlcjoNCg0KIyMjIyBPdmVyIFRpbWU6DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KIyBQbG90IGFsbCB0d2l0dGVyIGFjdGl2aXR5IGluIHdlZWtseSBpbnRlcnZhbHMNCg0KdHNfcGxvdChqb2ludF90aW1lbGluZXMsICJ3ZWVrcyIsIGNvbG9yID0gIiMwMEFEQjUiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJUaW1lIFNlcmllcyBTaG93aW5nIEFsbCBUd2l0dGVyIEFjdGl2aXR5IG9mIENob3NlbiBNZWRpYSIpICsNCiAgeGxhYigiV2VlayIpICsNCiAgeWxhYigiVHdlZXQgRnJlcXVlbmN5IikNCg0KYGBgDQoNClRpbWUgc2VyaWVzIHNob3dpbmcgYWxsIFR3aXR0ZXIgYWN0aXZpdHkgb2YgY2hvc2VuIG1lZGlhIGluZGljYXRlcyB0aGF0IHRoZSBpcyBhIHN0YXJrIGluY3JlYXNlIGluIFR3aXR0ZXIgYWN0aXZpdHkgaW4gMjAyMS5UaGVyZSBzZWVtcyB0byBiZSBhIHN0cm9uZyBpbmNyZWFzZSBpbiB0d2VldHMgYXQgdGhlIGJlZ2lubmluZyBvZiAyMDIwIGFuZCAyMDIxLiANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KDQojIEdyb3VwIGJ5IGlzX3JldHdlZXQgYW5kIHBsb3QgbXVsdGlwbGUgdGltZSBzZXJpZXMgb2YgcmV0d2VldHMgdnMgbm9uLXJldHdlZXRzDQoNCmpvaW50X3RpbWVsaW5lcyAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KGlzX3JldHdlZXQpICU+JQ0KICB0c19wbG90KCJob3VycyIsIGNvbG9yID0gIiMwMEFEQjUiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJUaW1lIFNlcmllczogUmV0d2VldHMgdnMgTm9uLXJldHdlZXRzIikgKw0KICB5bGFiKCJUd2VldCBGcmVxdWVuY3kiKSArDQogIHhsYWIoIkhvdXJzIikNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KDQojIEdyb3VwIGJ5IHNjcmVlbl9uYW1lIGFuZCBwbG90IGVhY2ggbWVkaWEgc291cmNlJ3MgdGltZSBzZXJpZXMNCg0KdHNfcGxvdChkcGx5cjo6Z3JvdXBfYnkoam9pbnRfdGltZWxpbmVzLCBzY3JlZW5fbmFtZSksIA0KICAgICAgICAid2Vla3MiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJUaW1lIFNlcmllcyBvZiBUd2VldHMgZnJvbSBJbmRpdmlkdWFsIE1lZGlhIFNvdXJjZXMiLA0KICAgICAgIGNhcHRpb24gPSAiVXBkYXRlZDogSnVseSAyMDIxIikgKw0KICB4bGFiKCJXZWVrIikgKw0KICB5bGFiKCJUd2VldCBGcmVxdWVuY3kiKQ0KDQpgYGANCg0KVGltZSBzZXJpZXMgb2YgdHdlZXRzIGZyb20gaW5kaXZpZHVhbCBtZWRpYSBzb3VyY2VzIGluZGljYXRlcyB0aGF0IHRoZXJlIHdhcyBhIHN0YXJrIGluY3JlYXNlIGluIFR3aXR0ZXIgYWN0aXZpdHkgaW4gSnVuZSBhbmQgSnVseSBvZiAyMDIxLlRoZSBtb3N0IGFjdGl2ZSBvZiB0aGVzZSBtZWRpYSBUd2l0dGVyIGFjY291bnRzIGlzIE5ld3MyNC4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KIyBHcm91cCBieSBzY3JlZW5fbmFtZSBhbmQgaXNfcmV0d2VldCwgdGhlbiBwbG90IGluZGl2aWR1YWwgdGltZSBzZXJpZXMNCg0Kam9pbnRfdGltZWxpbmVzICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoc2NyZWVuX25hbWUsIGlzX3JldHdlZXQpICU+JQ0KICB0c19wbG90KCJtb250aHMiLCBzaXplID0gMSkgKw0KICB5bGFiKCJUd2VldCBGcmVxdWVuY3kiKSArDQogIHhsYWIoIk1vbnRocyIpICsgDQogIHRoZW1lX2hjKCkgKw0KICBsYWJzKHRpdGxlID0gIlRpbWUgU2VyaWVzIG9mIFR3ZWV0cyBmcm9tIEluZGl2aWR1YWwgTWVkaWEgU291cmNlcyBhbmQgaWYgdGhleSBhcmUgUmV0d2VldHMiLCANCiAgICAgICBjYXB0aW9uID0gIlVwZGF0ZWQ6IEp1bHkgMjAyMSIpDQoNCmBgYA0KDQpUaW1lIHNlcmllcyBvZiB0d2VldHMgZnJvbSBpbmRpdmlkdWFsIG1lZGlhIHNvdXJjZXMsIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZXJlIGFyZSB2ZXJ5IGZldyByZXR3ZWV0cyBieSB0aGVzZSBpbmRpdmlkdWFsIHNvdXJjZXMuDQoNCmBgYHtyIFZhY2NpbmVfU2VudGltZW50X0FuYWx5c2lzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojIFZBQ0NJTkUgU0VOVElNRU5UIEFOQUxZU0lTIA0KDQojQ29udmVydCBjcmVhdGVkX2F0IGNvbHVtbiBpbnRvIERhdGUgYW5kIFRpbWUgb2YgQmhla2lzaXNhDQpiaGVraXNpc2FfdHdlZXRzJERhdGUgPC0gYXMuRGF0ZShiaGVraXNpc2FfdHdlZXRzJGNyZWF0ZWRfYXQpDQpiaGVraXNpc2FfdHdlZXRzJFRpbWUgPC0gZm9ybWF0KGJoZWtpc2lzYV90d2VldHMkY3JlYXRlZF9hdCwiJUg6JU06JVMiKQ0KI3NlbGVjdCB0aW1lZnJhbWUNCmJoZWtfdmFjIDwtIGJoZWtpc2lzYV90d2VldHNbYmhla2lzaXNhX3R3ZWV0cyREYXRlID49ICIyMDIxLTA0LTE0IiAmIGJoZWtpc2lzYV90d2VldHMkRGF0ZSA8PSAiMjAyMS0wNS0zMSIsXQ0KYmhla192YWMxIDwtIGJoZWtpc2lzYV90d2VldHNbYmhla2lzaXNhX3R3ZWV0cyREYXRlID49ICIyMDIxLTA2LTAxIiAmIGJoZWtpc2lzYV90d2VldHMkRGF0ZSA8PSAiMjAyMS0wNy0wOCIsXQ0KDQojQ29udmVydCBjcmVhdGVkX2F0IGNvbHVtbiBpbnRvIERhdGUgYW5kIFRpbWUgb2YgSGVhbHRoMjQNCmhlYWx0aDI0X3RpbWVsaW5lX2RmJERhdGUgPC0gYXMuRGF0ZShoZWFsdGgyNF90aW1lbGluZV9kZiRjcmVhdGVkX2F0KQ0KaGVhbHRoMjRfdGltZWxpbmVfZGYkVGltZSA8LSBmb3JtYXQoaGVhbHRoMjRfdGltZWxpbmVfZGYkY3JlYXRlZF9hdCwiJUg6JU06JVMiKQ0KI3NlbGVjdCB0aW1lZnJhbWUNCmhlYWx0aDI0X3ZhYyA8LSBoZWFsdGgyNF90aW1lbGluZV9kZltoZWFsdGgyNF90aW1lbGluZV9kZiREYXRlID49ICIyMDIxLTA0LTE0IiAmIGhlYWx0aDI0X3RpbWVsaW5lX2RmJERhdGUgPD0gIjIwMjEtMDUtMzEiLF0NCmhlYWx0aDI0X3ZhYzEgPC0gaGVhbHRoMjRfdGltZWxpbmVfZGZbaGVhbHRoMjRfdGltZWxpbmVfZGYkRGF0ZSA+PSAiMjAyMS0wNi0wMSIgJiBoZWFsdGgyNF90aW1lbGluZV9kZiREYXRlIDw9ICIyMDIxLTA3LTA4IixdDQoNCg0KI0NvbnZlcnQgY3JlYXRlZF9hdCBjb2x1bW4gaW50byBEYXRlIGFuZCBUaW1lIG9mIE5JQ0QNCm5pY2RfdHdlZXRzJERhdGUgPC0gYXMuRGF0ZShuaWNkX3R3ZWV0cyRjcmVhdGVkX2F0KQ0KbmljZF90d2VldHMkVGltZSA8LSBmb3JtYXQobmljZF90d2VldHMkY3JlYXRlZF9hdCwiJUg6JU06JVMiKQ0KI3NlbGVjdCB0aW1lZnJhbWUNCm5pY2RfdmFjIDwtbmljZF90d2VldHNbbmljZF90d2VldHMkRGF0ZSA+PSAiMjAyMS0wNC0xNCIgJiBuaWNkX3R3ZWV0cyREYXRlIDw9ICIyMDIxLTA1LTMxIixdDQpuaWNkX3ZhYzEgPC1uaWNkX3R3ZWV0c1tuaWNkX3R3ZWV0cyREYXRlID49ICIyMDIxLTA2LTAxIiAmIG5pY2RfdHdlZXRzJERhdGUgPD0gIjIwMjEtMDctMDgiLF0NCg0KDQojQ29udmVydCBjcmVhdGVkX2F0IGNvbHVtbiBpbnRvIERhdGUgYW5kIFRpbWUgb2YgZU5DQQ0KZW5jYV90aW1lbGluZV9kZiREYXRlIDwtIGFzLkRhdGUoZW5jYV90aW1lbGluZV9kZiRjcmVhdGVkX2F0KQ0KZW5jYV90aW1lbGluZV9kZiRUaW1lIDwtIGZvcm1hdChlbmNhX3RpbWVsaW5lX2RmJGNyZWF0ZWRfYXQsIiVIOiVNOiVTIikNCiNzZWxlY3QgdGltZWZyYW1lDQplbmNhX3ZhYyA8LSBlbmNhX3RpbWVsaW5lX2RmW2VuY2FfdGltZWxpbmVfZGYkRGF0ZSA+PSAiMjAyMS0wNC0xNCIgJiBlbmNhX3RpbWVsaW5lX2RmJERhdGUgPD0gIjIwMjEtMDUtMzEiLF0NCmVuY2FfdmFjMSA8LSBlbmNhX3RpbWVsaW5lX2RmW2VuY2FfdGltZWxpbmVfZGYkRGF0ZSA+PSAiMjAyMS0wNi0wMSIgJiBlbmNhX3RpbWVsaW5lX2RmJERhdGUgPD0gIjIwMjEtMDctMDgiLF0NCg0KDQojQ29udmVydCBjcmVhdGVkX2F0IGNvbHVtbiBpbnRvIERhdGUgYW5kIFRpbWUgb2YgSGVhbHRoWkEgDQpoZWFsdGh6YV90d2VldHMkRGF0ZSA8LSBhcy5EYXRlKGhlYWx0aHphX3R3ZWV0cyRjcmVhdGVkX2F0KQ0KaGVhbHRoemFfdHdlZXRzJFRpbWUgPC0gZm9ybWF0KGhlYWx0aHphX3R3ZWV0cyRjcmVhdGVkX2F0LCIlSDolTTolUyIpDQojc2VsZWN0IHRpbWVmcmFtZQ0KaGVhbHRoemFfdmFjIDwtIGhlYWx0aHphX3R3ZWV0c1toZWFsdGh6YV90d2VldHMkRGF0ZSA+PSAiMjAyMS0wNC0xNCIgJiBoZWFsdGh6YV90d2VldHMkRGF0ZSA8PSAiMjAyMS0wNS0zMSIsXQ0KaGVhbHRoemFfdmFjMSA8LSBoZWFsdGh6YV90d2VldHNbaGVhbHRoemFfdHdlZXRzJERhdGUgPj0gIjIwMjEtMDYtMDEiICYgaGVhbHRoemFfdHdlZXRzJERhdGUgPD0gIjIwMjEtMDctMDgiLF0NCg0KDQojQ29udmVydCBjcmVhdGVkX2F0IGNvbHVtbiBpbnRvIERhdGUgYW5kIFRpbWUgb2YgTmV3czI0DQpuZXdzMjRfdHdlZXRzJERhdGUgPC0gYXMuRGF0ZShuZXdzMjRfdHdlZXRzJGNyZWF0ZWRfYXQpDQpuZXdzMjRfdHdlZXRzJFRpbWUgPC0gZm9ybWF0KG5ld3MyNF90d2VldHMkY3JlYXRlZF9hdCwiJUg6JU06JVMiKQ0KI3NlbGVjdCB0aW1lZnJhbWUNCm5ld3MyNF92YWMgPC0gbmV3czI0X3R3ZWV0c1tuZXdzMjRfdHdlZXRzJERhdGUgPj0gIjIwMjEtMDQtMTQiICYgbmV3czI0X3R3ZWV0cyREYXRlIDw9ICIyMDIxLTA1LTMxIixdDQpuZXdzMjRfdmFjMSA8LSBuZXdzMjRfdHdlZXRzW25ld3MyNF90d2VldHMkRGF0ZSA+PSAiMjAyMS0wNi0wMSIgJiBuZXdzMjRfdHdlZXRzJERhdGUgPD0gIjIwMjEtMDctMDgiLF0NCg0KDQojY29tYmluZWQgZGYgZnJvbSAwNC0xNCB0byAwNS0zMQ0KY29tcGxldGVfdmFjX2RmMSA8LQ0KICBiaGVrX3ZhYyAlPiUNCiAgZnVsbF9qb2luKGhlYWx0aHphX3ZhYykgJT4lDQogIGZ1bGxfam9pbihuZXdzMjRfdmFjKSAlPiUNCiAgZnVsbF9qb2luKG5pY2RfdmFjKSAlPiUNCiAgZnVsbF9qb2luKGVuY2FfdmFjKSAlPiUNCiAgZnVsbF9qb2luKGhlYWx0aDI0X3ZhYykgDQoNCiNzZWFyY2ggYWxsIHR3ZWV0cyBjb250YWluaW5nICd2YWNjaW5lJw0KY29tcGxldGVfdmFjX2RmMSA8LSANCiAgZHBseXI6OmZpbHRlcihjb21wbGV0ZV92YWNfZGYxLCBncmVwbCgndmFjY2luZScsIHRleHQpKSAlPiUNCiAgc2VsZWN0KCJzY3JlZW5fbmFtZSIsICJ0ZXh0IikgDQogIA0KY29tcGxldGVfdmFjX2RmMSRzdHJpcHBlZF90ZXh0IDwtIA0KICBnc3ViKCJodHRwXFxTKyIsICIiLGNvbXBsZXRlX3ZhY19kZjEkdGV4dCkNCg0KY29tcGxldGVfc2VudF9kZjEgPC0gDQogIGNvbXBsZXRlX3ZhY19kZjEgJT4lDQogIHNlbGVjdChzdHJpcHBlZF90ZXh0KSAlPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBzdHJpcHBlZF90ZXh0KQ0KDQpjb21wbGV0ZV9zZW50X2RmMSAlPiUNCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpDQoNCiNiaW5nIHNlbnRpbWVudCBhbmFseXNpcyBvbiBjb21wbGV0ZV92YWNfZGYxIHR3ZWV0cw0KY29tcGxldGVfc2VudF9kZjEgPC0gY29tcGxldGVfc2VudF9kZjEgJT4lDQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoImJpbmciKSkgJT4lDQogIGNvdW50KHdvcmQsIHNlbnRpbWVudCwgc29ydCA9VFJVRSklPiUNCiAgY291bnQoc2VudGltZW50KSU+JQ0KICBzcHJlYWQoc2VudGltZW50LCBuLCBmaWxsID0gMCkgJT4lIA0KICBtdXRhdGUoc2VudGltZW50ID0gcG9zaXRpdmUgLSBuZWdhdGl2ZSkgDQoNCg0KbmFtZSA8LSBjKCcxNCBBcHJpbC0gMzEgTWF5IDIwMjEnKQ0Ka2xldXIgPC0gYyhGQUxTRSkNCg0KY29tcGxldGVfc2VudF9kZjEgPC0NCiAgY2JpbmQobmFtZSxjb21wbGV0ZV9zZW50X2RmMSwga2xldXIpDQoNCiNjb21iaW5lZCBkZiBmcm9tIDA2LTAxIHRvIDA3LTA4DQpjb21wbGV0ZV92YWNfZGYyIDwtDQogIGJoZWtfdmFjMSAlPiUNCiAgZnVsbF9qb2luKGhlYWx0aHphX3ZhYzEpICU+JQ0KICBmdWxsX2pvaW4obmV3czI0X3ZhYzEpICU+JQ0KICBmdWxsX2pvaW4obmljZF92YWMxKSAlPiUNCiAgZnVsbF9qb2luKGVuY2FfdmFjMSkgJT4lDQogIGZ1bGxfam9pbihoZWFsdGgyNF92YWMxKQ0KDQojc2VhcmNoIGFsbCB0d2VldHMgY29udGFpbmluZyAndmFjY2luZScNCg0KY29tcGxldGVfdmFjX2RmMiA8LSANCiAgZHBseXI6OmZpbHRlcihjb21wbGV0ZV92YWNfZGYyLCBncmVwbCgndmFjY2luZScsIHRleHQpKSAlPiUNCiAgc2VsZWN0KCJzY3JlZW5fbmFtZSIsICJ0ZXh0IikgDQogIA0KY29tcGxldGVfdmFjX2RmMiRzdHJpcHBlZF90ZXh0IDwtDQogIGdzdWIoImh0dHBcXFMrIiwgIiIsY29tcGxldGVfdmFjX2RmMiR0ZXh0KQ0KDQpjb21wbGV0ZV9zZW50X2RmMiA8LSBjb21wbGV0ZV92YWNfZGYyICU+JQ0KICBzZWxlY3Qoc3RyaXBwZWRfdGV4dCkgJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgc3RyaXBwZWRfdGV4dCkNCg0KY29tcGxldGVfc2VudF9kZjIgJT4lDQogIGFudGlfam9pbihzdG9wX3dvcmRzKQ0KDQojYmluZyBzZW50aW1lbnQgYW5hbHlzaXMgb24gY29tcGxldGVfdmFjX2RmMSB0d2VldHMNCmNvbXBsZXRlX3NlbnRfZGYyIDwtIA0KICBjb21wbGV0ZV9zZW50X2RmMiAlPiUNCiAgaW5uZXJfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUNCiAgY291bnQod29yZCwgc2VudGltZW50LCBzb3J0ID1UUlVFKSU+JQ0KICBjb3VudChzZW50aW1lbnQpJT4lDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKQ0KDQoNCm5hbWUgPC0gYygnMSBKdW5lLSA4IEp1bHkgMjAyMScpDQprbGV1ciA8LSBjKEZBTFNFKQ0KY29tcGxldGVfc2VudF9kZjIgPC0NCiAgY2JpbmQobmFtZSxjb21wbGV0ZV9zZW50X2RmMiwga2xldXIpDQoNCiNiaW5kIGJvdGggc2VudGltZW50IGRmcw0KY29tcGxldGVfZGYgPC0NCiAgYmluZF9yb3dzKGNvbXBsZXRlX3NlbnRfZGYyLCBjb21wbGV0ZV9zZW50X2RmMSkNCiAgDQojcGxvdCBib3RoIHNlbnRpbWVudCBkZiBvbiBvbmUgcGxvdCwgDQpnZ3Bsb3QoY29tcGxldGVfZGYsIGFlcyh4ID0gc29ydChuYW1lLCBkZWNyZWFzaW5nID0gVCksIHkgPSBzZW50aW1lbnQsIGZpbGwgPSBrbGV1cikpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMC4yNSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBBREI1IiksIGd1aWRlID0gRkFMU0UpKw0KICB0aGVtZV9oYygpKw0KICBsYWJzKHRpdGxlID0gIlR3ZWV0cyBjb250YWluaW5nICd2YWNjaW5lJyIsDQogICAgICAgeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gTlVMTCwgc3VidGl0bGUgPSAiRnJvbSAxNCBBcHJpbCB0byA4IEp1bHkgMjAyMSAiKSANCg0KYGBgDQpUaGUgYWJvdmUgdmlzdWFsaXNhdGlvbiB0YWtlcyB0d2VldHMgY29udGFpbmluZyB0aGUgdGVybSAndmFjY2luZScgYW5kIG1lYXN1cmVzIGl0cycgZnJlcXVlbmN5IGZyb20gMSBKdW5lIHRvIDMxIE1heSAyMDIxLiBUbyBlbXBoYXNpc2UgdGhlIGRpZmZlcmVuY2UgaW4gc2VudGltZW50LCB0aGlzIHRpbWVsaW5lIHdhcyBzcGxpdCBpbiB0d28gY2h1bmtzLCBvbmUgYmVpbmcgJzEgSnVuZS0gOCBKdWx5IDIwMjEnIGFuZCB0aGUgb3RoZXIgJzE0IEFwcmlsLSAzMSBNYXkgMjAyMScuIE9uZSBjYW4gc2VlIGEgc2lnbmlmaWNhbnQgaW5jcmVhc2UgaW4gbmVnYXRpdmUgc2VudGltZW50IG9udG8gdGhlIHNlY29uZCB0aW1lbGluZSBzZW50aW1lbnQuIA0KDQoNCg0KIyBBZGRpdGlvbmFsIFJlcXVpcmVtZW50czoNCg0KIyMjIyBCeSBNZWRpYSBTb3VyY2U6DQoNCmBgYHtyIENvdmlkMTlfVmFjY2luZV9EYXRhX0NvbXBhcmlzb25fV2l0aF9Ud2VldHMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KIyBDb252ZXJ0aW5nIGFuZCBmb3JtYXR0aW5nIGRhdGVzDQoNCnZhY2NpbmVfdHdlZXRzJERhdGUgPC0gDQogIGFzLkRhdGUodmFjY2luZV90d2VldHMkY3JlYXRlZF9hdCkNCg0KdmFjY2luZV90d2VldHMkVGltZSA8LSANCiAgZm9ybWF0KHZhY2NpbmVfdHdlZXRzJGNyZWF0ZWRfYXQsIiVIOiVNOiVTIikNCg0KdmFjY2luYXRpb25zJERhdGUgPC0gDQogIGFzLkRhdGUodmFjY2luYXRpb25zJGRhdGUpDQoNCiMgVW4tbmVzdGluZyB0b2tlbnMgb2YgdHdlZXRzDQoNCnRpZHlfdmFjY2luZV90d2VldHMgPC0gDQogIHZhY2NpbmVfdHdlZXRzICU+JQ0KICAgIHNlbGVjdChjcmVhdGVkX2F0LHRleHQpICU+JQ0KICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KQ0KDQojIENsZWFuaW5nIGFuZCBmaWx0ZXJpbmcgZm9yIHZhY2NpbmUgd29yZHMNCg0KdmFjY2luZV93b3JkcyA8LSANCiAgdmFjY2luZV90d2VldHMgJT4lDQogIG11dGF0ZSh0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIiZhbXA7fCZsdDt8Jmd0OyIpLA0KICB0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIlxccz8oZnxodCkodHApKHM/KSg6Ly8pKFteXFwuXSlbXFwufC9dKFxcUykiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJbXlx4MDEtXHg3Rl0iKSkgJT4lIA0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQsIHRva2VuID0gInR3ZWV0cyIpICU+JQ0KICBmaWx0ZXIoIXdvcmQgJWluJSBzdG9wX3dvcmRzJHdvcmQsDQogICF3b3JkICVpbiUgc3RyX3JlbW92ZV9hbGwoc3RvcF93b3JkcyR3b3JkLCAiJyIpLA0KICBzdHJfZGV0ZWN0KHdvcmQsICJbYS16XSIpLA0KICAhc3RyX2RldGVjdCh3b3JkLCAiXiMiKSwgDQogICFzdHJfZGV0ZWN0KHdvcmQsICJAXFxTKyIpKSAlPiUNCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpDQoNCiMgUGxvdCB0aGUgZnJlcXVlbmN5IG9mIHZhY2NpbmUgdHdlZXRzIG92ZXIgdGltZQ0KDQp0c19wbG90KHZhY2NpbmVfdHdlZXRzKSArDQogIGdndGl0bGUoIkxpbmUgR3JhcGggc2hvd2luZyB0aGUgZnJlcXVlbmN5IG9mIHZhY2NpbmUgdHdlZXRzIG92ZXIgdGltZSIpDQoNCmBgYA0KDQpUaW1lIHNlcmllcyBsaW5lIGdyYXBoIHNob3dpbmcgdGhlIHRoZSBmcmVxdWVuY3kgb2YgdmFjY2luZSB0d2VldHMgb3ZlciB0aW1lIGluZGljYXRlcyB0aGUgZnJlcXVlbmN5IG9mICB0d2VldHMgcGVydGFpbmluZyB0byB2YWNjaW5hdGlvbnMgaW4gU291dGggQWZyaWNhIGlzIHNoYXJwbHkgaW5jcmVhc2luZy4NCg0KYGBge3IgRGFpbHlfVmFjX1Bsb3QsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KIyBQbG90IExpbmUgR3JhcGggZ3JhcGggU2hvd2luZyBEYWlseSBWYWNjaW5hdGlvbnMgT3ZlciBUaW1lDQoNCmdncGxvdCh2YWNjaW5hdGlvbnMsIA0KICAgICAgIGFlcyh4ID0gcm91bmRfZGF0ZQ0KICAgICAgICAgICAocGFyc2VfZGF0ZV90aW1lDQogICAgICAgICAgICAgKGRhdGUsICJZJS9tJS9kJSIpLA0KICAgICAgICAgICAgIHVuaXQgPSAiZGF5IiksIA0KICAgICAgICAgICB5ID0gdmFjY2luYXRlZF9kYWlseSkpICsNCiAgZ2VvbV9saW5lKHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICAgY29sb3IgPSAicmVkIiwgDQogICAgICAgICAgICBzaXplID0gMSkgKw0KICB4bGFiKCJEYXRlIikgKw0KICB5bGFiKCJEYWlseSBWYWNjaW5hdGlvbnMiKSArDQogIGdndGl0bGUoIkxpbmUgR3JhcGggZ3JhcGggU2hvd2luZyBEYWlseSBWYWNjaW5hdGlvbnMgT3ZlciBUaW1lIikNCg0KYGBgDQoNCkxpbmUgZ3JhcGggc2hvd2luZyB0aGUgZGFpbHkgdmFjY2luYXRpb25zIG92ZXIgdGltZSBzaGFycGx5IGluY3JlYXNpbmcgYXMgbW9yZSBwZW9wbGUgYXJlIHBlcm1pdHRlZCB0byBiZSB2YWNjaW5hdGVkLiANCg0KYGBge3IgVG90YWxfVmFjX3Bsb3QsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KIyBQbG90IGxpbmUgZ3JhcGggc2hvd2luZyB0b3RhbCB2YWNjaW5hdGlvbnMgb3ZlciB0aW1lDQoNCmdncGxvdCgpICsNCiAgZ2VvbV9saW5lKHZhY2NpbmF0aW9ucywNCiAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHJvdW5kX2RhdGUNCiAgICAgICAgICAgICAgICAocGFyc2VfZGF0ZV90aW1lDQogICAgICAgICAgICAgICAgICAoZGF0ZSwgIlklL20lL2QlIiksDQogICAgICAgICAgICAgICAgICB1bml0ID0gImRheSIpLA0KICAgICAgICAgICAgICAgIHkgPSB2YWNjaW5hdGVkX3RvdGFsKSwNCiAgICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICAgY29sb3IgPSAicmVkIiwNCiAgICAgICAgICAgIHNpemUgPSAxKSArDQogIHhsYWIoIkRhdGUiKSArDQogIHlsYWIoIlRvdGFsIFZhY2NpbmF0aW9ucyIpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsNTAwMDAwMCkpICsNCiAgZ2d0aXRsZSgiTGluZSBHcmFwaCBncmFwaCBTaG93aW5nIFRvdGFsIFZhY2NpbmF0aW9ucyBPdmVyIFRpbWUiKQ0KYGBgDQoNClRoZSBsaW5lIGdyYXBoIHNob3dpbmcgdGhlIHRvdGFsIHZhY2NpbmF0aW9ucyBzaG93cyBzdGVlcCBpbmNyZWFzZXMgd2hlbmV2ZXIgbmV3IGFnZSBncm91cHMgYXJlIHBlcm1pdHRlZCB0byBiZSB2YWNjaW5hdGVkLiANCg0KV2hlbiB0YWtpbmcgYWxsIHRocmVlIGNoYXJ0cyBpbnRvIGFjY291bnQgaXQgY2FuIGJlIHN1cm1pc2VkIHRoYXQgdGhlcmUgaXMgYSBjb3JyZWxhdGlvbiB3aGVuIG9ic2VydmluZyB0aGUgbW9yZSBhZ2UgZ3JvdXBzIGFyZSBwZXJtaXR0ZWQgdG8gYmUgdmFjY2luYXRlZCBpbiBTb3V0aCBBZnJpY2EsdGhlIG1vcmUgdHdlZXRzIHBlcnRhaW5pbmcgdG8gdmFjY2luZXMgYXJlIG1hZGUuDQoNCiMgUmVwb3J0IFN1bW1hcnk6DQoNClRoZSB2aXN1YWxpc2F0aW9ucyBkcmF3biBmcm9tIHRoZSB0ZXh0IGFuYWx5c2lzIG1ldGhvZHMgdXNlZCBpbiB0aGlzIHJlcG9ydCBkaXNwbGF5IGNlcnRhaW4gY29tbW9uIGNoYXJhY3RlcmlzdGljcyBmcm9tIHdoaWNoIGNlcnRhaW4gY29uY2x1c2lvbnMgY2FuIGJlIGRvY3VtZW50ZWQuIFRoZXJlIHNlZW1zIHRvIGJlIGEgZGlmZmVyZW5jZSBpbiBob3cgc2VsZWN0ZWQgbWVkaWEgc291cmNlcyBwcmVzZW50IGluZm9ybWF0aW9uIHJlZ2FyZGluZyBDT1ZJRC0xOSBhbmQgaXRzIHVuZGVybHlpbmcgYnJhbmNoZXMsIHN1Y2ggYXMgZGVhdGhzLCB2YWNjaW5hdGlvbnMsIGFuZCB0ZXN0cy4gQWxzbywgdGhlIHBlcnRhaW5pbmcgc2VudGltZW50IGFuZCB0b3BpY3Mgb2YgdGhlc2Ugc3ViamVjdHMuDQoNClZhY2NpbmF0aW9ucyBzZWVtIHRvIGJlIHJlZmxlY3RpbmcgYW4gaW5jcmVhc2luZ2x5IG5lZ2F0aXZlIGNvbm5vdGF0aW9uIGZyb20gaXRzIGluaXRpYWwgc3Bpa2UgaW4gdXNlIHdpdGhpbiB0aGUgdHdlZXRzIG9mIGFsbCB0ZW4gbWVkaWEgc291cmNlcy4gVGhlIG9jY3VycmVuY2Ugb2YgaW5jcmVhc2luZyBuYXRpb25hbCB2YWNjaW5hdGlvbnMgZ3JvdyBwYXJhbGxlbCB3aXRoIHRoYXQgb2Yg4oCYdmFjY2luZeKAmSBiZWluZyBtZW50aW9uZWQgaW4gdHdlZXRzLiBBcyBkZXNjcmliZWQsIHRoZSBpbmNyZWFzZSBvZiB2YWNjaW5hdGlvbnMgaW4geW91bmdlciBhZ2UgZ3JvdXBzIGFyZSBhbHNvIHJlZmxlY3Rpbmcgb24g4oCYdmFjY2luZeKAmSBpbmNyZWFzaW5nbHkgb2NjdXJyaW5nIGluIHR3ZWV0cyBmcm9tIHRoZXNlIHNvdXJjZXMuDQoNCkNvbnRyYXJ5IHRvIG91ciBiZWxpZWYsIOKAmHRlc3Rz4oCZIG9yIOKAmHRlc3RpbmfigJkgd2FzIG5vdCBhcyBwb3B1bGFyIGFzIGV4cGVjdGVkLCBhcyBpdCB3YXMgYSBtYWpvciBzdWJqZWN0IG1hdHRlciBpbiB0aGUgaW5pdGlhbCByaXNlIG9mIENPVklEIC0xOSwgYmFjayBpbiAyMDIwLiDigJhjb3ZpZOKAmSBpcyBtZW50aW9uZWQgd2l0aGluIGV2ZXJ5IHRvcCAxMCB3b3JkcyBvciBoYXNodGFncyBvZiBhbGwgdGVuIHVzZWQgbWVkaWEgc291cmNlcy4gSW5kaWNhdGluZyB0aGF0IGl0IHN0aWxsIGlzIGFuZCBoYXMgYmVlbiBhIHZlcnkgcG9wdWxhciB0ZXJtIHVzZWQgb3ZlciBhIG51bWJlciBvZiBtb250aHMuIOKAmHZpcnVz4oCZLCDigJhpbmZlY3Rpb27igJkgYW5kIOKAmGRlYXRo4oCZIHNlZW0gdG8gYmUgdGhlIG1vc3QgaGVhdmlseSBuZWdhdGl2ZSB3b3JkcyB1c2VkIGluIHRoZSB0d2VldHMgYnkgdGhlIGNob3NlbiBtZWRpYSBzb3VyY2VzLCB3aGljaCBhcmUgQ09WSUQtcmVsYXRlZC4gQW1vbmcgb3RoZXIgdG9wIHRlbiBuZWdhdGl2ZSB3b3JkcyBhcmUg4oCYc3ltcHRvbXPigJkgYW5kIOKAmHJpc2vigJkuIERpZmZlcmVuY2VzIGluIHNlbnRpbWVudCBiZXR3ZWVuIHByaXZhdGUgYW5kIGdvdmVybm1lbnQgc291cmNlcyBzaG91bGQgYmUgbm90ZWQuIA0KDQpJbiBzdW1tYXRpb24sIHdpdGggcmVnYXJkcyB0byB0aGUgdG9waWMgbW9kZWxsaW5nIHNlY3Rpb24sIHdlIHdlcmUgYWJsZSB0byBkZXRlcm1pbmUgdGhlIGhpZ2hlc3QgVEYtSURGIChUZXJtIEZyZXF1ZW5jeS1JbnZlcnNlIERvY3VtZW50IEZyZXF1ZW5jeSkgd29yZHMgaW4gdGhlIHNpeCBzZWxlY3RlZCBtZWRpYSBzb3VyY2VzLCB0aGUgaGlnaGVzdCB3b3JkIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggdG9waWMsIHRoZSB0b3AgdGVuIG1lZGlhIHRvcGljcyBhY2NvcmRpbmcgdG8gdGhlIGJldGEgbWF0cml4IGF0IHRvcGljIGxldmVsIDEsIGFzIHdlbGwgYXMgdGhlIGRpc3RyaWJ1dGlvbiBvZiB3b3JkIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggdG9waWMuIOKAmGNvdmlk4oCZIGhhcyBhIG5vdGFibGUgcHJlc2VuY2Ugd2l0aGluIGFsbCB0aGVzZSBhbmFseXNpcyBtZXRob2RzLiANCg0KSW4gcmVnYXJkIHRvIHRoZSB0ZXh0IG5ldHdvcmtzLCB3ZSB3ZXJlIGFibGUgdG8gaWRlbnRpZnkgdHdvIGNsdXN0ZXJzIG9yIGNvbW11bml0aWVzIHdpdGhpbiB0aGUgYXV0aG9yLWJhc2VkIHByb2plY3Rpb24gdGV4dCBuZXR3b3JrIGFuZCBzaXggY2x1c3RlcnMgb3IgY29tbXVuaXRpZXMgd2l0aGluIHRoZSB3b3JkLWJhc2VkIHByb2plY3Rpb24gdGV4dCBuZXR3b3JrLiBGcm9tIHRoZXNlIHRleHQgbmV0d29ya3Mgd2Ugd2VyZSBhYmxlIHRvIGRlcml2ZSBpbnNpZ2h0IGZyb20gd2hpY2ggd29yZCBvciBtZWRpYSBzb3VyY2VzIGhhdmUgYSBzdHJvbmcgc2ltaWxhcml0eSB3aXRoIGVhY2ggb3RoZXIuDQoNCiMgUmV0cm9zcGVjdGl2ZToNCg0KTG9va2luZyBiYWNrIHRoZXJlIGFyZSBhIGZldyBwb2ludHMgdGhlIHByb2plY3QgZ3JvdXAgd291bGQgbGlrZSB0byBoYXZlIGNoYW5nZWQuIEZpcnN0bHksIGFlc3RoZXRpYyBlbmhhbmNlbWVudHMgZm9yIGdyYXBoIHZpc3VhbGl6YXRpb25zIHN1Y2ggYXMgbnVtZXJpYyB2YWx1ZXMgb24gdG9wIG9mIGJhciBjaGFydCBiaW5zIGFuZCBiZXR0ZXIgdGFidWxhciB2aXN1YWxpemF0aW9ucy4gU2Vjb25kbHksIGEgZ3JlYXRlciB1c2Ugb2YgdGhlIGBgYFZhZGVyYGBgIGFuZCBgYGBzZW50aW1lbnRSYGBgIHBhY2thZ2VzLiBUaGlyZGx5LCBtb3JlIGV4dGVybmFsIENPVklELTE5IGRhdGEgdGhhdCBjb3VsZCBiZSAgY29sbGF0ZWQgd2l0aCBUd2l0dGVyIGRhdGEuIEZpbmFsbHksIGNvbWJpbmluZyB0aGUgVHdpdHRlciB0aW1lIHNlcmllcyBwbG90cyB3aXRoIGxvY2tkb3duIGxldmVsIGFuZCBpbmZlY3Rpb24gd2F2ZSBvdmVybGF5cy4NCg==